Package com.twelvemonkeys.image
Class DiffusionDither
- java.lang.Object
-
- com.twelvemonkeys.image.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
ThisBufferedImageOp/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 x 7/16 3/16 5/16 1/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 aDiffusionDither
, with no fixedIndexColorModel
.DiffusionDither(java.awt.image.IndexColorModel pICM)
Creates aDiffusionDither
, using the givenIndexColorModel
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 compatibleBufferedImage
to dither into.java.awt.image.WritableRaster
createCompatibleDestRaster(java.awt.image.Raster pSrc)
Creates a compatibleRaster
to dither into.java.awt.image.WritableRaster
createCompatibleDestRaster(java.awt.image.Raster pSrc, java.awt.image.IndexColorModel pIndexColorModel)
Creates a compatibleRaster
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.
-
-
-
Field Detail
-
FS_SCALE
private static final int FS_SCALE
- See Also:
- Constant Field Values
-
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 aDiffusionDither
, using the givenIndexColorModel
for dithering into.- Parameters:
pICM
- an IndexColorModel.
-
DiffusionDither
public DiffusionDither()
Creates aDiffusionDither
, with no fixedIndexColorModel
. The color model will be generated for each filtering, unless the destination image already has anIndexColorModel
.
-
-
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 istrue
.- 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 compatibleBufferedImage
to dither into. OnlyIndexColorModel
allowed.- Specified by:
createCompatibleDestImage
in interfacejava.awt.image.BufferedImageOp
- Returns:
- a compatible
BufferedImage
- Throws:
ImageFilterException
- ifpDestCM
is notnull
or an instance ofIndexColorModel
.
-
createCompatibleDestRaster
public final java.awt.image.WritableRaster createCompatibleDestRaster(java.awt.image.Raster pSrc)
Creates a compatibleRaster
to dither into. OnlyIndexColorModel
allowed.- Specified by:
createCompatibleDestRaster
in interfacejava.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 compatibleRaster
to dither into.- Parameters:
pSrc
- the source raster.pIndexColorModel
- the index color model used to create aRaster
.- 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 interfacejava.awt.image.BufferedImageOp
- Parameters:
pSrc
- theBufferedImage
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 interfacejava.awt.image.RasterOp
- Parameters:
pSrc
- theRaster
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. IfdstPt
is notnull
, it will be used to hold the return value. Since this is not a geometric operation, thesrcPt
will equal thedstPt
.- Specified by:
getPoint2D
in interfacejava.awt.image.BufferedImageOp
- Specified by:
getPoint2D
in interfacejava.awt.image.RasterOp
- Parameters:
pSrcPt
- aPoint2D
that represents a point in the source imagepDstPt
- aPoint2D
that 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 interfacejava.awt.image.BufferedImageOp
- Specified by:
getRenderingHints
in interfacejava.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 interfacejava.awt.image.BufferedImageOp
- Parameters:
pSource
- the source imagepDest
- the destination image- Returns:
- the destination image, or a new image, if
pDest
wasnull
.
-
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 interfacejava.awt.image.RasterOp
- Parameters:
pSource
- the source raster, assumed to be in sRGBpDest
- the destination raster, may benull
- Returns:
- the destination raster, or a new raster, if
pDest
wasnull
.
-
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 sRGBpDest
- the destination raster, may benull
pColorModel
- the indexed color model to use- Returns:
- the destination raster, or a new raster, if
pDest
wasnull
.
-
-