
// Inverter.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Three ways to invert the pixels in am image.

   Usage:
     > compile Inverter.java
     > run Inverter <fnm>
   e.g.
     > run Inverter frankenburg-1918.png
*/

import java.awt.*;

import ij.*;
import ij.gui.*;
import ij.process.*;


public class Inverter
{

  public static void main(String[] args)
  {
    if (args.length != 1) {
      System.out.println("Usage: run Inverter <fnm>");
      return;
    }
    ImagePlus imp = new ImagePlus(args[0]);
    imp.show();

    // first approach
    ImagePlus inverted = imp.duplicate();
    inverted.setTitle("Inverted " + imp.getTitle());
    ImageProcessor invProc = inverted.getProcessor();
    invProc.invert();

/*
    // second approach
    ImagePlus inverted = imp.duplicate();
    IJ.run(inverted, "Image Inverter", "");
*/

/*
    // third approach
    ImagePlus inverted = invertImage(imp);
*/
    inverted.show();

    ImageUtils.waitGone(inverted); 
    System.exit(0);
  } /* main */


  private static ImagePlus invertImage(ImagePlus imp)
  {
    int width = imp.getWidth();
    int height = imp.getHeight();

    ImageProcessor imProc = imp.getProcessor();

    // create new image with same size
    ImagePlus inverted = NewImage.createRGBImage(
                 "Inverted " + imp.getTitle(),
                 width, height, 1, NewImage.FILL_BLACK);

    // copy over the original image
    ImageProcessor invProc = inverted.getProcessor();
    invProc.copyBits(imProc, 0, 0, Blitter.COPY);

    // invert the pixels 
    int[] pixels = (int[]) invProc.getPixels();
    for (int i = 0; i < height; i++) {
      int offset = i*width;
      for (int j = 0; j < width; j++) {
        int pos = offset+j;
        pixels[pos] = invertColor(pixels[pos]);
      }
    }
    return inverted;
  }  // end of invertImage()



  private static int invertColor(int c)
  {
    int r = 255 - ImageUtils.getRed(c);
    int g = 255 - ImageUtils.getGreen(c);
    int b = 255 - ImageUtils.getBlue(c);
    return ImageUtils.makePixel(r, g, b);
  }  // end of invertColor()


}  // end of Inverter class

