import ij.*; import ij.gui.*; import ij.process.*; import ij.plugin.filter.*; /* DCT plugin v 1.0, Sep. 18, 2001 Werner Bailer */ public class DCT_ implements PlugInFilter { protected double outscale; protected double outadd; public int setup(String arg, ImagePlus imp) { return DOES_8G+DOES_16+DOES_32+DOES_STACKS; } public void run(ImageProcessor ip) { int n=8; int u=0; int v=0; boolean forward = true; boolean resize =false; boolean pwr2 = false; // user interface //////////////////////////////////////////////////////// while (!pwr2) { GenericDialog dlg = new GenericDialog("DCT/IDCT parameters"); dlg.addNumericField("block size N (power of 2)",8,0); dlg.addCheckbox("inverse DCT",false); String[] resOrTiles = new String[2]; resOrTiles[0]="split image into tiles of size N x N"; resOrTiles[1]="resize image to N x N"; dlg.addChoice("resize or tile?",resOrTiles,resOrTiles[0]); dlg.addNumericField("multiply output with:",1.0,5); dlg.addNumericField("add to output:",0.0,5); dlg.showDialog(); if (dlg.wasCanceled()) return; n = (int) dlg.getNextNumber(); outscale = dlg.getNextNumber(); pwr2 = (((n & (n-1))==0) && (n>0)); forward = !(dlg.getNextBoolean()); if (dlg.getNextChoiceIndex()==1) resize=true; if (!pwr2) IJ.showMessage(n+" is not a power of 2!"); } ////////////////////////////////////////////////////////////////////////// if (resize) ip=ip.resize(n,n); ImagePlus newimage = null; DCT dct = new DCT(n); int w = ip.getWidth(); int h = ip.getHeight(); // prepare output image newimage = NewImage.createFloatImage("",w-w%n,h-h%n,1,NewImage.FILL_BLACK); ImageProcessor np = newimage.getProcessor(); // calculate (I)DCT for each tile for (int i=0;i-1) { zz[i][j]=zval; zval++; i++; j--; } i=N-1; j=k; while (j-1) { zz[i][j]=zval; zval++; j++; i--; } i=k; j=N-1; while (i