Dithering a 24-bit RGB image to a monochrome (1-bit or bilevel) image : Image Filter « 2D Graphics GUI « Java






Dithering a 24-bit RGB image to a monochrome (1-bit or bilevel) image

    
//-----------------------------------------------------------------------//
//                                                                       //
//                        R G B T o B i l e v e l                        //
//                                                                       //
//-----------------------------------------------------------------------//
/*
 * Copyright (c) 2002 Sun Microsystems, Inc. All Rights Reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * -Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * -Redistribution in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of Sun Microsystems, Inc. or the names of contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * This software is provided "AS IS," without a warranty of any kind. ALL
 * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
 * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
 * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
 * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
 * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
 * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
 * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
 * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
 * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGES.
 *
 * You acknowledge that Software is not designed,licensed or intended for use in
 * the design, construction, operation or maintenance of any nuclear facility.
 */

package omr.jai;

import java.awt.*;
import java.awt.color.*;
import java.awt.event.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.image.renderable.*;
import java.util.*;
import javax.media.jai.*;
import javax.media.jai.operator.*;
import javax.media.jai.widget.*;

/**
 * Demo code for dithering a 24-bit RGB image to a monochrome (1-bit
 * or bilevel) image. The source image must be an 24-bit RGB image.
 * The result is displayed.
 *
 * Usage: java RGBToBilevel filename [true]
 *
 * If the second argument is present and equal to "true" then error diffusion
 * will be used; otherwise ordered dithering will be used.
 */
public class RGBToBilevel extends Frame {
    public static void main(String[] args) {
        new RGBToBilevel(args[0],
                         args.length > 1 ? args[1].equals("true") : false);
    }

    RGBToBilevel(final String fileName,
                 boolean isErrorDiffusion)
    {

        // Load the file.
        PlanarImage src = JAI.create("fileload", fileName);

        // Load the ParameterBlock for the dithering operation
        // and set the operation name.
        ParameterBlock pb = new ParameterBlock();
        pb.addSource(src);
        String opName = null;
        if(isErrorDiffusion) {
            opName = "errordiffusion";
            LookupTableJAI lut =
                new LookupTableJAI(new byte[][] {{(byte)0x00, (byte)0xff},
                                                 {(byte)0x00, (byte)0xff},
                                                 {(byte)0x00, (byte)0xff}});
            pb.add(lut);
            pb.add(KernelJAI.ERROR_FILTER_FLOYD_STEINBERG);
        } else {
            opName = "ordereddither";
            ColorCube cube = ColorCube.createColorCube(DataBuffer.TYPE_BYTE,
                                                       0, new int[] {2, 2, 2});
            pb.add(cube);
            pb.add(KernelJAI.DITHER_MASK_443);
        }

        // Create a layout containing an IndexColorModel which maps
        // zero to zero and unity to 255; force SampleModel to be bilevel.
        ImageLayout layout = new ImageLayout();
        byte[] map = new byte[] {(byte)0x00, (byte)0xff};
        ColorModel cm = new IndexColorModel(1, 2, map, map, map);
        layout.setColorModel(cm);
        SampleModel sm = new MultiPixelPackedSampleModel(DataBuffer.TYPE_BYTE,
                                                         src.getWidth(),
                                                         src.getHeight(),
                                                         1);
        layout.setSampleModel(sm);

        // Create a hint containing the layout.
        RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT,
                                                  layout);

        // Dither the image.
        final PlanarImage dst = JAI.create(opName, pb, hints);

        // Exit on window closing.
        addWindowListener(new WindowAdapter() {
                public void windowClosing(WindowEvent we) {
                    JAI.create("filestore", dst, fileName + ".out", "PNG", null);
                    System.exit(0);
                }
            });


        // Display the result.
        //// ATTENTION A REMPLACER : add(new ScrollingImagePanel(dst, dst.getWidth(), dst.getHeight()));
        pack();
        setVisible(true);
    }
}

   
    
    
    
  








Related examples in the same category

1.Image Filter
2.ImageComparator compares a byte[] for equality by creating 2 hashes for the bytearray and comparing thoose hashes.
3.Gray scale image operationGray scale image operation
4.Image Color Operation: dark, bright, contrast, negativeImage Color Operation: dark, bright, contrast, negative
5.If the image has transparent pixels
6.Copy Raster