omr.jai.TestImage3.java Source code

Java tutorial

Introduction

Here is the source code for omr.jai.TestImage3.java

Source

    //-----------------------------------------------------------------------//
    //                                                                       //
    //                           T e s t I m a g e 3                         //
    //                                                                       //
    //  Copyright (C) Herve Bitteur 2000-2007. All rights reserved.          //
    //  This software is released under the terms of the GNU General Public  //
    //  License. Please contact the author at herve.bitteur@laposte.net      //
    //  to report bugs & suggestions.                                        //
    //-----------------------------------------------------------------------//
    package omr.jai;

    import omr.jai.ImageInfo;

    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.color.ColorSpace;
    import java.awt.geom.AffineTransform;
    import java.awt.image.BufferedImage;
    import java.awt.image.ColorModel;
    import java.awt.image.DataBuffer;
    import java.awt.image.Raster;
    import java.awt.image.RenderedImage;
    import java.awt.image.renderable.ParameterBlock;
    import javax.media.jai.JAI;
    import javax.media.jai.PlanarImage;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.util.Arrays;
    import javax.media.jai.InterpolationNearest;
    import javax.media.jai.InterpolationBilinear;

public class TestImage3
    extends JPanel
{
    //RenderedImage image;
    PlanarImage image;

    // Affine tranform
    final float ratio = 4f;
    AffineTransform scaleXform = AffineTransform.getScaleInstance(ratio, ratio);

    private static char WHITE = '-';    // And transparent
    private static char[] charTable = new char[]
    {
        '#',  // 0 Black
        '$',  // 1
        '*',  // 2
        '0',  // 3
        'o',  // 4
        '+',  // 5
        '.',  // 6
        WHITE // 7
    };

    //------------//
    // TestImage3 //
    //------------//
    public TestImage3()
    {
        JFrame frame = new JFrame(getClass().getName());
        Container pane = frame.getContentPane();
        pane.setLayout(new BorderLayout());

        pane.add(this);

        image = decodeImage(new String[] {
                "#-###############",
                "-----------------",
                "#################",
                "-----------------",
                "#################",
                "-----------------",
                "#################",
                "-----------------",
                "#################",
                "-----------------",
                "#################",
                "-----------------",
                "-----------------",
                "-----------------",
                "---####----------",
                "-------##--------",
                "---------####----",
                "-------------#---",
                "-------------#---",
                "-----------------",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "--#############--",
                "-----------------",
                "-----------------",
                "---####----------",
                "-------##--------",
                "---------####----",
                "-------------#---",
                "-------------#---",
                "-----------------",
                "--#############--",
                "--#############--",
                "-----------------",
                "-----------------"
        });

        //        checkImageFormat();

        ImageInfo.print(image);

        // Scaling
        final float scale = 1f;
        ParameterBlock pb = new ParameterBlock()
            .addSource(image)
            .add(scale)
            .add(scale)
            .add(0f)
            .add(0f)
            .add(new InterpolationNearest());
        image = JAI.create("scale", pb);
        dumpPixels(0, 0, 5, 7);

        if (false) {
            System.out.println("\nBand Selection");
            image = JAI.create("bandselect",image,new int[] {0, 1, 2});
            ImageInfo.print(image);
            dumpPixels(0, 0, 5, 7);
        }

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.pack();
        frame.setSize(100, 250);
        frame.setVisible(true);
    }

    private void dumpPixels (int x0,
                             int y0,
                             int w,
                             int h)
    {
        Raster raster = image.getData();
        int[] pixel = null;
        System.out.print("pixels=");
        for (int y = y0; y < y0+h; y++) {
            System.out.println();
            for (int x = x0; x <= x0+w; x++) {
                pixel = raster.getPixel(x, y, pixel);
                System.out.print(" [");
                for (int i = 0; i < pixel.length; i++) {
                    System.out.print(String.format("%3x", pixel[i]));
                }
                System.out.print("]");
            }
        }
        System.out.println();
    }


    //------//
    // main //
    //------//
    public static void main(String... args)
    {
        new TestImage3();
    }

    //----------------//
    // paintComponent //
    //----------------//
    public void paintComponent(Graphics g)
    {
        // For background
        super.paintComponent(g);

        // Meant for visual check
        if (image != null) {

            Graphics2D g2 = (Graphics2D) g;

            g2.drawRenderedImage (image, scaleXform);
            //g2.drawImage (image, 1, 1, this);
        }
    }

    //-------------//
    // decodeImage //
    //-------------//
    public static PlanarImage decodeImage (String[] rows)
    {
        // Create the DataBuffer to hold the pixel samples
        final int width = rows[0].length();
        final int height = rows.length;

        // Create Raster
        Raster raster;
        if (true) {
            raster = Raster.createPackedRaster
            (DataBuffer.TYPE_INT, width, height,
             new int[] {0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000},// bandMasks RGBA
             null);
        } else {
            raster = Raster.createInterleavedRaster
                (DataBuffer.TYPE_BYTE, width, height,
                 4,// num of bands
                 null);
        }

        // Populate the data buffer
        DataBuffer dataBuffer = raster.getDataBuffer();
        int index = 0;
        for (String row : rows) {
            for (int x = 0; x < width; x++) {
                int argb = toARGB(row.charAt(x));
                dataBuffer.setElem(index, argb);
                index++;
            }
        }

        // Dump
//         final int size = width * height;
//         System.out.println("DataBuffer :");
//         for (int i = 0; i < size; i++) {
//             if (i % width == 0) {
//                 System.out.println();
//             }
//             System.out.print(String.format("%8x ", dataBuffer.getElem(i)));
//         }
//         System.out.println();

        // Create the image
        BufferedImage bufferedImage = new BufferedImage
                (width, height, BufferedImage.TYPE_INT_ARGB);
        bufferedImage.setData(raster);

        // Dump
//         System.out.println("BufferedImage :");
//         for (int y = 0; y < height; y++) {
//             System.out.println();
//             for (int x = 0; x < width; x++) {
//                 System.out.print(String.format("%8x ", bufferedImage.getRGB(x, y)));
//             }
//         }
//         System.out.println();

        return PlanarImage.wrapRenderedImage(bufferedImage);
    }

    //--------//
    // toARGB //
    //--------//
    /**
     * Compute the ARGB pixel that corresponds to the given char
     *
     * @param c the char
     * @return the corresponding pixel value (ARGB format)
     */
    private static int toARGB (char c)
    {
        // Check the char
        if (c == WHITE) {
            return 0x00ffffff;      // Totally transparent / white
        } else {
            for (int i = charTable.length -1; i >= 0; i--) {
                if (charTable[i] == c) {
                    int level = 3 + i * 36; // Range 3 .. 255 (not too bad)
                    return
                        255   << 24 |      // Alpha (opaque)
                        level << 16 |      // R
                        level <<  8 |      // G
                        level;             // B
                }
            }
        }

        return 0x00ffffff;      // Totally transparent / white
    }

    //------------------//
    // checkImageFormat //
    //------------------//
    /**
     * Check if the image format (and especially its color model) is
     * properly handled by Audiveris.
     *
     * @throws ImageFormatException is the format is not supported
     */
    private void checkImageFormat()
    {
        // Check nb of bands
        int numBands = image.getSampleModel().getNumBands();
        if (numBands != 1) {
            if (numBands == 3) {
                image = colorToGray(image);
            } else {
                throw new RuntimeException
                    ("Unsupported sample model" +
                     " numBands=" + numBands);
            }
        }

        // Check pixel size
        ColorModel colorModel = image.getColorModel();
        int pixelSize = colorModel.getPixelSize();
        if (pixelSize != 8) {
            System.out.println("pixelSize=" + pixelSize +
                    " colorModel=" + colorModel);
            image = grayToGray256(image);
        }
    }

    //--------//
    // invert //
    //--------//
    private static PlanarImage invert (PlanarImage image)
    {
        return JAI.create("Invert",
                          new ParameterBlock()
                          .addSource(image)
                          .add(null)
                          .add(null)
                          .add(null)
                          .add(null)
                          .add(null),
                          null);
    }

    //-------------//
    // colorToGray //
    //-------------//
    private static PlanarImage colorToGray (PlanarImage image)
    {
        System.out.println("Converting color image to gray ...");
        double[][] matrix = { {0.114d, 0.587d, 0.299d, 0.0d} };

        return JAI.create("bandcombine",
                          new ParameterBlock()
                          .addSource(image)
                          .add(matrix),
                          null);
    }

    //---------------//
    // grayToGray256 //
    //---------------//
    private static PlanarImage grayToGray256 (PlanarImage image)
    {
        System.out.println("Converting gray image to gray-256 ...");

        ColorSpace colorSpace = ColorSpace.getInstance
            (java.awt.color.ColorSpace.CS_GRAY);

//        int[] bits = new int[]{8};
//        int opaque = Transparency.OPAQUE;
//        int dataType = DataBuffer.TYPE_BYTE;
//        ColorModel colorModel = new ComponentColorModel
//            (colorSpace, bits, false, false, opaque, dataType);

        return JAI.create("colorConvert", image, colorSpace, null);
    }

}
    //-----------------------------------------------------------------------//
    ////
    //I m a g e I n f o                           //
    ////
    //Copyright (C) Herve Bitteur 2000-2007. All rights reserved.          //
    //This software is released under the terms of the GNU General Public  //
    //License. Please contact the author at herve.bitteur@laposte.net      //
    //to report bugs & suggestions.                                        //
    //-----------------------------------------------------------------------//

    import java.awt.Transparency;
    import java.awt.image.*;
    import java.io.File;
    import javax.media.jai.*;

    public class ImageInfo {
        public static void main(String[] args) {
            // Open the image (using the name passed as a command line parameter)
            PlanarImage pi = JAI.create("fileload", args[0]);

            // Get the image file size (non-JAI related).
            File image = new File(args[0]);
            System.out.println("Image file size: " + image.length() + " bytes.");

            print(pi);
        }

        public static void print(PlanarImage pi) {
            // Show the image dimensions and coordinates.
            System.out.print("Image Dimensions: ");
            System.out.print(pi.getWidth() + "x" + pi.getHeight() + " pixels");

            // Remember getMaxX and getMaxY return the coordinate of the next point!
            System.out.println(" (from " + pi.getMinX() + "," + pi.getMinY() + " to " + (pi.getMaxX() - 1) + ","
                    + (pi.getMaxY() - 1) + ")");
            if ((pi.getNumXTiles() != 1) || (pi.getNumYTiles() != 1)) { // Is it tiled?
                // Tiles number, dimensions and coordinates.
                System.out.print("Tiles: ");
                System.out.print(pi.getTileWidth() + "x" + pi.getTileHeight() + " pixels" + " (" + pi.getNumXTiles()
                        + "x" + pi.getNumYTiles() + " tiles)");
                System.out.print(" (from " + pi.getMinTileX() + "," + pi.getMinTileY() + " to " + pi.getMaxTileX() + ","
                        + pi.getMaxTileY() + ")");
                System.out.println(" offset: " + pi.getTileGridXOffset() + "," + pi.getTileGridXOffset());
            }

            // Display info about the SampleModel of the image.
            SampleModel sm = pi.getSampleModel();
            System.out.println("Number of bands: " + sm.getNumBands());
            System.out.print("Data type: ");
            switch (sm.getDataType()) {
            case DataBuffer.TYPE_BYTE:
                System.out.println("byte");
                break;
            case DataBuffer.TYPE_SHORT:
                System.out.println("short");
                break;
            case DataBuffer.TYPE_USHORT:
                System.out.println("ushort");
                break;
            case DataBuffer.TYPE_INT:
                System.out.println("int");
                break;
            case DataBuffer.TYPE_FLOAT:
                System.out.println("float");
                break;
            case DataBuffer.TYPE_DOUBLE:
                System.out.println("double");
                break;
            case DataBuffer.TYPE_UNDEFINED:
                System.out.println("undefined");
                break;
            }

            // Display info about the ColorModel of the image.
            ColorModel cm = pi.getColorModel();
            if (cm != null) {
                System.out.println("Number of color components: " + cm.getNumComponents());
                System.out.println("Bits per pixel: " + cm.getPixelSize());
                System.out.print("Image Transparency: ");
                switch (cm.getTransparency()) {
                case Transparency.OPAQUE:
                    System.out.println("opaque");
                    break;
                case Transparency.BITMASK:
                    System.out.println("bitmask");
                    break;
                case Transparency.TRANSLUCENT:
                    System.out.println("translucent");
                    break;
                }
            } else
                System.out.println("No color model.");
        }
    }