| LutViewer |

    package ij.plugin.filter;
    import ij.*;
    import ij.process.*;
    import ij.gui.*;
    import ij.text.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;

    /** Displays the active image's look-up table. */
    public class LutViewer implements PlugInFilter {

        ImagePlus imp;

        public int setup(String arg, ImagePlus imp) {
            this.imp = imp;
            return DOES_ALL-DOES_RGB+NO_UNDO+NO_CHANGES;
        }

        public void run(ImageProcessor ip) {
            int xMargin = 35;
            int yMargin = 20;
            int width = 256;
            int height = 128;
            int x, y, x1, y1, x2, y2;
            int imageWidth, imageHeight;
            int barHeight = 12;
            boolean isGray;
            double scale;

            ip = imp.getChannelProcessor();
            IndexColorModel cm = (IndexColorModel)ip.getColorModel();
            LookUpTable lut = new LookUpTable(cm);
            int mapSize = lut.getMapSize();
            byte[] reds = lut.getReds();
            byte[] greens = lut.getGreens();
            byte[] blues = lut.getBlues();
            isGray = lut.isGrayscale();

            imageWidth = width + 2*xMargin;
            imageHeight = height + 3*yMargin;
            Image img = IJ.getInstance().createImage(imageWidth, imageHeight);
            Graphics g = img.getGraphics();
            g.setColor(Color.white);
            g.fillRect(0, 0, imageWidth, imageHeight);
            g.setColor(Color.black);
            g.drawRect(xMargin, yMargin, width, height);

            scale = 256.0/mapSize;
            if (isGray)
                g.setColor(Color.black);
            else
                g.setColor(Color.red);
            x1 = xMargin;
            y1 = yMargin + height - (reds[0]&0xff)/2;
            for (int i = 1; i<256; i++) {
                x2 = xMargin + i;
                y2 = yMargin + height - (reds[(int)(i/scale)]&0xff)/2;
                g.drawLine(x1, y1, x2, y2);
                x1 = x2;
                y1 = y2;
            }

            if (!isGray) {
                g.setColor(Color.green);
                x1 = xMargin;
                y1 = yMargin + height - (greens[0]&0xff)/2;
                for (int i = 1; i<256; i++) {
                    x2 = xMargin + i;
                    y2 = yMargin + height - (greens[(int)(i/scale)]&0xff)/2;
                    g.drawLine(x1, y1, x2, y2);
                    x1 = x2;
                    y1 = y2;
                }
            }

            if (!isGray) {
                g.setColor(Color.blue);
                x1 = xMargin;
                y1 = yMargin + height - (blues[0]&0xff)/2;
                for (int i = 1; i<255; i++) {
                    x2 = xMargin + i;
                    y2 = yMargin + height - (blues[(int)(i/scale)]&0xff)/2;
                    g.drawLine(x1, y1, x2, y2);
                    x1 = x2;
                    y1 = y2;
                }
            }

            x = xMargin;
            y = yMargin + height + 2;
            lut.drawColorBar(g, x, y, 256, barHeight);

            y += barHeight + 15;
            g.setColor(Color.black);
            g.drawString("0", x - 4, y);
            g.drawString(""+(mapSize-1), x + width - 10, y);
            g.drawString("255", 7, yMargin + 4);
            g.dispose();

            ImagePlus imp = new ImagePlus("Look-Up Table", img);
            //imp.show();
            new LutWindow(imp, new ImageCanvas(imp), ip);
        }

    } // LutViewer class

    class LutWindow extends ImageWindow implements ActionListener {

        private Button button;
        private ImageProcessor ip;

        LutWindow(ImagePlus imp, ImageCanvas ic, ImageProcessor ip) {
            super(imp, ic);
            this.ip = ip;
            addPanel();
        }

        void addPanel() {
            Panel panel = new Panel();
            panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
            button = new Button(" List... ");
            button.addActionListener(this);
            panel.add(button);
            add(panel);
            pack();
        }

        public void actionPerformed(ActionEvent e) {
            Object b = e.getSource();
            if (b==button)
                list(ip);
        }

        void list(ImageProcessor ip) {
            IndexColorModel icm = (IndexColorModel)ip.getColorModel();
            int size = icm.getMapSize();
            byte[] r = new byte[size];
            byte[] g = new byte[size];
            byte[] b = new byte[size];
            icm.getReds(r);
            icm.getGreens(g);
            icm.getBlues(b);
            StringBuffer sb = new StringBuffer();
            String headings = "Index\tRed\tGreen\tBlue";
            for (int i=0; i<size; i++)
                sb.append(i+"\t"+(r[i]&255)+"\t"+(g[i]&255)+"\t"+(b[i]&255)+"\n");
            TextWindow tw = new TextWindow("LUT", headings, sb.toString(), 250, 400);
        }

    } // LutWindow class

| LutViewer |