
// CombinePics.java
// Andrew Davison, ad@coe.psu.ac.th, April 2023

/* Apply all the ImageCalculator operations to two
   images, generating a montage of the results.

   Usage:
     > compile CombinePics.java
     > run CombinePics
*/

import java.util.*;

import ij.*;
import ij.io.*;
import ij.gui.*;
import ij.plugin.*;
import ij.process.*;


public class CombinePics
{
  private static String[] OPS = { 
    "add", "subtract", "multiply", "divide", "and", "or", "xor", 
    "min", "max", "average", "difference" };


  public static void main(String[] args)
  {    
    ImagePlus imp1 = IJ.openImage("Albert-Einstein.jpg");
    ImagePlus imp2 = IJ.openImage("Marilyn_Monroe.jpg");

    ImageStack stack = new ImageStack();
    stack.addSlice("albert", imp1.getProcessor());
    stack.addSlice("marilyn", imp2.getProcessor());

    for (int i=0; i < OPS.length; i++) {
      ImagePlus opImp = ImageCalculator.run(imp1, imp2, OPS[i] + " create");
      stack.addSlice(OPS[i], opImp.getProcessor());
    }

    ImagePlus impStack = new ImagePlus("Image Ops", stack);
    System.out.println("No. of images: " + impStack.getStackSize());
    // impStack.show();

    MontageMaker mm = new MontageMaker();
    mm.setFontSize(16);
    int numCols = (int)Math.ceil( stack.getSize()/3.0);
    ImagePlus montage = mm.makeMontage2(impStack, numCols, 3, 0.25,
                                          1, stack.getSize(), 1, 5, true);
              // num cols, num rows, scale, first, last, inc, border, use labels
    montage.show();
  } /* main */


}  // end of CombinePics class
