Hi Adam,
I haven't read through everything you've written here, but it sounds
like you've already learned about the major players here - there are
access methods at a number of levels - BufferedImage, Raster,
DataBuffer, and some helper methods on SampleModel and ColorModel as
well. The further down you dig, the faster things run since you are
closer to "the metal".
[Keep in mind that digging the DataBuffer out of a Raster will defeat
the "managed image" acceleration of BufferedImages in 1.6 and earlier -
1.7 will have a more flexible accounting scheme that lets you get the
DataBuffer from a BufferedImage as long as you don't call the getData()
method on the DataBuffer to get the raw Java array.]
Note that the simplest, easiest to use, jack of all trades, accessor
would be BufferedImage.getRGB(x, y) which returns a 32-bit ARGB value
regardless of the underlying image type. It won't be as fast as
analyzing the image and using the underlying methods that you've already
investigated, but it lets you get the job done if you fall through the
cracks of your image type detection code and it performs well enough for
smaller tasks - grabbing the value of the occasional pixel...
...jim
Adam Augusta wrote:
So I've written a limited Java EPS creator for image files using
BufferedImage and Image I/O, but it's not perfect.
I need to determine if it's RGB, CMYK, or grayscale (including 1-bit
B&W), get the bits per component, collect the samples in per-pixel
sequence in a certain order (RGB not BGR), and write my EPS. Oh, and
if there's an alpha channel, I need to get those values and handle
them specially.
Ascertaining type:
BufferedImage#getColorModel#getColorSpace#getType works for CMYK, but
for 1-bit B&W, it reports 8-bit RGB. BufferedImage#getType works for
1-bit B&W (BufferedImage.TYPE_BYTE_BINARY), but not for CMYK
(BufferedImage.TYPE_CUSTOM).
So already, I'm forced to use a different strategy for different kinds
of images. Do I have the right idea?
Accessing sample information with a ColorModel is easy.
final Object reusableDataArray = raster.getDataElements(x, y, null)
final int[] reusableSampleArray =
colorModel.getComponents(sampleArray, null, 0);
final int bitsPerComponent = colorModel.getComponentSize(0);
Accessing sample information from a Raster/SampleModel
(TYPE_BYTE_BINARY) isn't quite so easy.
BufferedImage#getType provides enough information to interpret the
output of Raster#getPixel, but that means I have to write new logic
for each #getType.
So right now, through trial and error I'm typing up a list of
BufferedImage.TYPE_*s that work well with ColorModel, and handling
them consistently. For each types that don't work well with
ColorModel, I'm writing special logic to interpret Raster#getPixel.
Am I on the right track, or am I just making this hard for myself?
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".
===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA2D-INTEREST". For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".