Class DiffusionDither

  • All Implemented Interfaces:
    java.awt.image.BufferedImageOp, java.awt.image.RasterOp

    public class DiffusionDither
    extends java.lang.Object
    implements java.awt.image.BufferedImageOp, java.awt.image.RasterOp
    This BufferedImageOp/RasterOp implements basic Floyd-Steinberg error-diffusion algorithm for dithering.

    The weights used are 7/16, 3/16, 5/16 and 1/16, distributed like this:

    Floyd-Steinberg error-diffusion weights
     x7/16
    3/165/161/16

    See Computer Graphics (Foley et al.) for more information.

    Version:
    $Id: DiffusionDither.java#1 $
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private boolean alternateScans  
      private static int FS_SCALE  
      protected java.awt.image.IndexColorModel indexColorModel  
      private static java.util.Random RANDOM  
    • Constructor Summary

      Constructors 
      Constructor Description
      DiffusionDither()
      Creates a DiffusionDither, with no fixed IndexColorModel.
      DiffusionDither​(java.awt.image.IndexColorModel pICM)
      Creates a DiffusionDither, using the given IndexColorModel for dithering into.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.awt.image.BufferedImage createCompatibleDestImage​(java.awt.image.BufferedImage pSource, java.awt.image.ColorModel pDestCM)
      Creates a compatible BufferedImage to dither into.
      java.awt.image.WritableRaster createCompatibleDestRaster​(java.awt.image.Raster pSrc)
      Creates a compatible Raster to dither into.
      java.awt.image.WritableRaster createCompatibleDestRaster​(java.awt.image.Raster pSrc, java.awt.image.IndexColorModel pIndexColorModel)
      Creates a compatible Raster to dither into.
      private java.awt.image.IndexColorModel createIndexColorModel​(java.awt.image.Raster pSource)  
      java.awt.image.BufferedImage filter​(java.awt.image.BufferedImage pSource, java.awt.image.BufferedImage pDest)
      Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
      java.awt.image.WritableRaster filter​(java.awt.image.Raster pSource, java.awt.image.WritableRaster pDest)
      Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
      java.awt.image.WritableRaster filter​(java.awt.image.Raster pSource, java.awt.image.WritableRaster pDest, java.awt.image.IndexColorModel pColorModel)
      Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
      java.awt.geom.Rectangle2D getBounds2D​(java.awt.image.BufferedImage pSrc)
      Returns the bounding box of the filtered destination image.
      java.awt.geom.Rectangle2D getBounds2D​(java.awt.image.Raster pSrc)
      Returns the bounding box of the filtered destination Raster.
      private java.awt.image.IndexColorModel getICM​(java.awt.image.BufferedImage pSource)  
      private java.awt.image.IndexColorModel getICM​(java.awt.image.Raster pSource)  
      java.awt.geom.Point2D getPoint2D​(java.awt.geom.Point2D pSrcPt, java.awt.geom.Point2D pDstPt)
      Returns the location of the destination point given a point in the source.
      java.awt.RenderingHints getRenderingHints()
      Returns the rendering mHints for this op.
      void setAlternateScans​(boolean pUse)
      Sets the scan mode.
      private static int toIntARGB​(int[] pRGB)
      Converts a int triplet to int ARGB.
      private static int[] toRGBArray​(int pARGB, int[] pBuffer)
      Converts an int ARGB to int triplet.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • RANDOM

        private static final java.util.Random RANDOM
      • indexColorModel

        protected final java.awt.image.IndexColorModel indexColorModel
      • alternateScans

        private boolean alternateScans
    • Constructor Detail

      • DiffusionDither

        public DiffusionDither​(java.awt.image.IndexColorModel pICM)
        Creates a DiffusionDither, using the given IndexColorModel for dithering into.
        Parameters:
        pICM - an IndexColorModel.
      • DiffusionDither

        public DiffusionDither()
        Creates a DiffusionDither, with no fixed IndexColorModel. The color model will be generated for each filtering, unless the destination image already has an IndexColorModel.
    • Method Detail

      • setAlternateScans

        public void setAlternateScans​(boolean pUse)
        Sets the scan mode. If the parameter is true, error distribution for every even line will be left-to-right, while odd lines will be right-to-left. The default is true.
        Parameters:
        pUse - true if scan mode should be alternating left/right
      • createCompatibleDestImage

        public final java.awt.image.BufferedImage createCompatibleDestImage​(java.awt.image.BufferedImage pSource,
                                                                            java.awt.image.ColorModel pDestCM)
        Creates a compatible BufferedImage to dither into. Only IndexColorModel allowed.
        Specified by:
        createCompatibleDestImage in interface java.awt.image.BufferedImageOp
        Returns:
        a compatible BufferedImage
        Throws:
        ImageFilterException - if pDestCM is not null or an instance of IndexColorModel.
      • createCompatibleDestRaster

        public final java.awt.image.WritableRaster createCompatibleDestRaster​(java.awt.image.Raster pSrc)
        Creates a compatible Raster to dither into. Only IndexColorModel allowed.
        Specified by:
        createCompatibleDestRaster in interface java.awt.image.RasterOp
        Parameters:
        pSrc - the source raster
        Returns:
        a WritableRaster
      • createCompatibleDestRaster

        public final java.awt.image.WritableRaster createCompatibleDestRaster​(java.awt.image.Raster pSrc,
                                                                              java.awt.image.IndexColorModel pIndexColorModel)
        Creates a compatible Raster to dither into.
        Parameters:
        pSrc - the source raster.
        pIndexColorModel - the index color model used to create a Raster.
        Returns:
        a WritableRaster
      • getBounds2D

        public final java.awt.geom.Rectangle2D getBounds2D​(java.awt.image.BufferedImage pSrc)
        Returns the bounding box of the filtered destination image. Since this is not a geometric operation, the bounding box does not change.
        Specified by:
        getBounds2D in interface java.awt.image.BufferedImageOp
        Parameters:
        pSrc - the BufferedImage to be filtered
        Returns:
        the bounds of the filtered definition image.
      • getBounds2D

        public final java.awt.geom.Rectangle2D getBounds2D​(java.awt.image.Raster pSrc)
        Returns the bounding box of the filtered destination Raster. Since this is not a geometric operation, the bounding box does not change.
        Specified by:
        getBounds2D in interface java.awt.image.RasterOp
        Parameters:
        pSrc - the Raster to be filtered
        Returns:
        the bounds of the filtered definition Raster.
      • getPoint2D

        public final java.awt.geom.Point2D getPoint2D​(java.awt.geom.Point2D pSrcPt,
                                                      java.awt.geom.Point2D pDstPt)
        Returns the location of the destination point given a point in the source. If dstPt is not null, it will be used to hold the return value. Since this is not a geometric operation, the srcPt will equal the dstPt.
        Specified by:
        getPoint2D in interface java.awt.image.BufferedImageOp
        Specified by:
        getPoint2D in interface java.awt.image.RasterOp
        Parameters:
        pSrcPt - a Point2D that represents a point in the source image
        pDstPt - a Point2Dthat represents the location in the destination
        Returns:
        the Point2D in the destination that corresponds to the specified point in the source.
      • getRenderingHints

        public final java.awt.RenderingHints getRenderingHints()
        Returns the rendering mHints for this op.
        Specified by:
        getRenderingHints in interface java.awt.image.BufferedImageOp
        Specified by:
        getRenderingHints in interface java.awt.image.RasterOp
        Returns:
        the RenderingHints object associated with this op.
      • toRGBArray

        private static int[] toRGBArray​(int pARGB,
                                        int[] pBuffer)
        Converts an int ARGB to int triplet.
      • toIntARGB

        private static int toIntARGB​(int[] pRGB)
        Converts a int triplet to int ARGB.
      • filter

        public final java.awt.image.BufferedImage filter​(java.awt.image.BufferedImage pSource,
                                                         java.awt.image.BufferedImage pDest)
        Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
        Specified by:
        filter in interface java.awt.image.BufferedImageOp
        Parameters:
        pSource - the source image
        pDest - the destination image
        Returns:
        the destination image, or a new image, if pDest was null.
      • filter

        public final java.awt.image.WritableRaster filter​(java.awt.image.Raster pSource,
                                                          java.awt.image.WritableRaster pDest)
        Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
        Specified by:
        filter in interface java.awt.image.RasterOp
        Parameters:
        pSource - the source raster, assumed to be in sRGB
        pDest - the destination raster, may be null
        Returns:
        the destination raster, or a new raster, if pDest was null.
      • getICM

        private java.awt.image.IndexColorModel getICM​(java.awt.image.BufferedImage pSource)
      • getICM

        private java.awt.image.IndexColorModel getICM​(java.awt.image.Raster pSource)
      • createIndexColorModel

        private java.awt.image.IndexColorModel createIndexColorModel​(java.awt.image.Raster pSource)
      • filter

        public final java.awt.image.WritableRaster filter​(java.awt.image.Raster pSource,
                                                          java.awt.image.WritableRaster pDest,
                                                          java.awt.image.IndexColorModel pColorModel)
        Performs a single-input/single-output dither operation, applying basic Floyd-Steinberg error-diffusion to the image.
        Parameters:
        pSource - the source raster, assumed to be in sRGB
        pDest - the destination raster, may be null
        pColorModel - the indexed color model to use
        Returns:
        the destination raster, or a new raster, if pDest was null.