this.transferType = image.getRaster().getTransferType(); this.bytesPerComponent = (transferType == DataBuffer.TYPE_SHORT || transferType == DataBuffer.TYPE_USHORT) ? 2 : 1;
dest.getTransferType() == DataBuffer.TYPE_BYTE && dest.getNumDataElements() >= 3 || dest.getTransferType() == DataBuffer.TYPE_INT && dest.getNumDataElements() == 1, src, "only 3 or 4 byte TYPE_BYTE or 1 int TYPE_INT rasters supported as dest: %s" if (dest.getTransferType() == DataBuffer.TYPE_BYTE) { final byte[] out = new byte[dest.getNumDataElements()]; else if (dest.getTransferType() == DataBuffer.TYPE_INT) { final int[] out = new int[dest.getNumDataElements()]; final byte[] temp = new byte[3]; // RGB
param != null ? param.getSourceXSubsampling() : 1); int transferType = rowRaster.getTransferType(); int samplesPerPixel = header.getSamplesPerPixel();
@Test public void testCreateCompatibleRaster() { int[] colors = createIntLut(1 << 8); IndexColorModel icm = new IndexColorModel(8, colors.length, colors, 0, false, -1, DataBuffer.TYPE_BYTE); ColorModel colorModel = new DiscreteAlphaIndexColorModel(icm); WritableRaster raster = colorModel.createCompatibleWritableRaster(3, 2); assertNotNull(raster); assertEquals(3, raster.getWidth()); assertEquals(2, raster.getHeight()); assertTrue(colorModel.isCompatibleRaster(raster)); assertThat(raster, CoreMatchers.is(WritableRaster.class)); // Specific subclasses are in sun.awt package assertThat(raster.getTransferType(), CoreMatchers.equalTo(DataBuffer.TYPE_BYTE)); }
throw new IIOException("TIFF PhotometricInterpretation YCbCr requires SamplesPerPixel == 3: " + rowRaster.getNumBands()); if (rowRaster.getTransferType() != DataBuffer.TYPE_BYTE && rowRaster.getTransferType() != DataBuffer.TYPE_USHORT) { throw new IIOException("TIFF PhotometricInterpretation YCbCr requires BitsPerSample == [8,8,8] or [16,16,16]"); adapter = createUnpredictorStream(predictor, stripTileWidth, numBands, bitsPerSample, adapter, imageInput.getByteOrder()); if (interpretation == TIFFExtension.PHOTOMETRIC_YCBCR && rowRaster.getTransferType() == DataBuffer.TYPE_BYTE) { adapter = new YCbCrUpsamplerStream(adapter, yCbCrSubsampling, yCbCrPos, colsInTile); else if (interpretation == TIFFExtension.PHOTOMETRIC_YCBCR && rowRaster.getTransferType() == DataBuffer.TYPE_USHORT) { adapter = new YCbCr16UpsamplerStream(adapter, yCbCrSubsampling, yCbCrPos, colsInTile, imageInput.getByteOrder());
protected static BufferedImage makeGrayBufferedImage(WritableRaster wr) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_GRAY); int[] bits = new int[1]; for (int i = 0; i < bits.length; i++) bits[i] = 8; ColorModel cm = new ComponentColorModel( cs, bits, false, false, ColorModel.OPAQUE, wr.getTransferType()); return new BufferedImage(cm, wr, false, null); }
protected static BufferedImage makeRGBBufferedImage(WritableRaster wr) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] bits = new int[3]; for (int i = 0; i < bits.length; i++) bits[i] = 8; ColorModel cm = new ComponentColorModel( cs, bits, false, false, ColorModel.OPAQUE, wr.getTransferType()); return new BufferedImage(cm, wr, false, null); }
/** * Utility to build an RGBA buffered image using the specified raster and * transparency type. * * @param wr writable raster of image. * @param transparency any valid Transparency interface type. Bitmask, * opaque and translucent. * @return constructed image. */ protected static BufferedImage makeRGBABufferedImage(WritableRaster wr, final int transparency) { ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); int[] bits = new int[4]; for (int i = 0; i < bits.length; i++) { bits[i] = 8; } ColorModel cm = new ComponentColorModel( cs, bits, true, false, transparency, wr.getTransferType()); return new BufferedImage(cm, wr, false, null); }
/** * Get and set variables that determine how picture is stored. * <p/> * Retrieves the writable raster of the buffered image, * as well its transfer type. * <p/> * Sets number of output bytes per pixel, and, if only * eight-bit bytes, turns off alpha encoding. * * @return true if 1-byte or 4-byte data, false otherwise */ protected boolean establishStorageInfo() { wRaster = image.getRaster(); int dataBytes = wRaster.getNumDataElements(); tType = wRaster.getTransferType(); if (((tType == DataBuffer.TYPE_BYTE) && (dataBytes == 4)) || ((tType == DataBuffer.TYPE_INT) && (dataBytes == 1))) { bytesPerPixel = (encodeAlpha) ? 4 : 3; } else if ((tType == DataBuffer.TYPE_BYTE) && (dataBytes == 1)) { bytesPerPixel = 1; encodeAlpha = false; // one-byte samples } else { return false; } return true; }
protected WritableRaster getRaster() { WritableRaster raster = null; if (primaryGraphics) { /* // 'offscreen' will probably be removed in the next release if (useOffscreen) { raster = offscreen.getRaster(); } else*/ if (image instanceof VolatileImage) { // when possible, we'll try VolatileImage raster = ((VolatileImage) image).getSnapshot().getRaster(); } } if (raster == null) { raster = ((BufferedImage) image).getRaster(); } // On Raspberry Pi (and perhaps other platforms, the color buffer won't // necessarily be the int array that we'd like. Need to convert it here. // Not that this would probably mean getRaster() would need to work more // like loadRaster/updateRaster because the pixels will need to be // temporarily moved to (and later from) a buffer that's understood by // the rest of the Processing source. // https://github.com/processing/processing/issues/2010 if (raster.getTransferType() != DataBuffer.TYPE_INT) { System.err.println("See https://github.com/processing/processing/issues/2010"); throw new RuntimeException("Pixel operations are not supported on this device."); } return raster; }
public static byte[] asByteArray(final BufferedImage image) { final int imageWidth = image.getWidth(null); final int imageHeight = image.getHeight(null); final boolean hasAlpha = image.getColorModel().hasAlpha(); final boolean grayscale = image.getColorModel().getNumComponents() == 1; if (image.getRaster().getTransferType() == DataBuffer.TYPE_BYTE) { return (byte[]) image.getRaster().getDataElements(0, 0, imageWidth, imageHeight, null); } final byte[] rVal = new byte[imageWidth * imageHeight * (grayscale ? 1 : (hasAlpha ? 4 : 3))]; final int[] tmpData = new int[imageWidth]; int index = 0; for (int y = 0; y < imageHeight; y++) { image.getRGB(0, y, imageWidth, 1, tmpData, 0, imageWidth); for (int i = 0; i < imageWidth; i++) { final int argb = tmpData[i]; if (grayscale) { rVal[index++] = (byte) (argb & 0xFF); } else { rVal[index++] = (byte) ((argb >> 16) & 0xFF); rVal[index++] = (byte) ((argb >> 8) & 0xFF); rVal[index++] = (byte) (argb & 0xFF); if (hasAlpha) { rVal[index++] = (byte) ((argb >> 24) & 0xFF); } } } } return rVal; }
public static byte[] asByteArray(final BufferedImage image) { final int imageWidth = image.getWidth(null); final int imageHeight = image.getHeight(null); final boolean hasAlpha = image.getColorModel().hasAlpha(); final boolean grayscale = image.getColorModel().getNumComponents() == 1; if (image.getRaster().getTransferType() == DataBuffer.TYPE_BYTE) { return (byte[]) image.getRaster().getDataElements(0, 0, imageWidth, imageHeight, null); } final byte[] rVal = new byte[imageWidth * imageHeight * (grayscale ? 1 : (hasAlpha ? 4 : 3))]; final int[] tmpData = new int[imageWidth]; int index = 0; for (int y = 0; y < imageHeight; y++) { image.getRGB(0, y, imageWidth, 1, tmpData, 0, imageWidth); for (int i = 0; i < imageWidth; i++) { final int argb = tmpData[i]; if (grayscale) { rVal[index++] = (byte) (argb & 0xFF); } else { rVal[index++] = (byte) ((argb >> 16) & 0xFF); rVal[index++] = (byte) ((argb >> 8) & 0xFF); rVal[index++] = (byte) (argb & 0xFF); if (hasAlpha) { rVal[index++] = (byte) ((argb >> 24) & 0xFF); } } } } return rVal; }
/** * Whether we can return the data buffer's bank data without performing any * copy or conversion operations. */ private static boolean canUseBankDataDirectly(final WritableRaster r, final int transferType, final Class<? extends DataBuffer> dataBufferClass) { final int tt = r.getTransferType(); if (tt != transferType) return false; final DataBuffer buffer = r.getDataBuffer(); if (!dataBufferClass.isInstance(buffer)) return false; final SampleModel model = r.getSampleModel(); if (!(model instanceof ComponentSampleModel)) return false; final ComponentSampleModel csm = (ComponentSampleModel) model; final int pixelStride = csm.getPixelStride(); if (pixelStride != 1) return false; final int w = r.getWidth(); final int scanlineStride = csm.getScanlineStride(); if (scanlineStride != w) return false; final int c = r.getNumBands(); final int[] bandOffsets = csm.getBandOffsets(); if (bandOffsets.length != c) return false; for (int i = 0; i < bandOffsets.length; i++) { if (bandOffsets[i] != 0) return false; } for (int i = 0; i < bandOffsets.length; i++) { if (bandOffsets[i] != i) return false; } return true; }
/** * Whether we can return the data buffer's bank data * without performing any copy or conversion operations. */ private static boolean canUseBankDataDirectly(WritableRaster r, int transferType, Class<? extends DataBuffer> dataBufferClass) { int tt = r.getTransferType(); if (tt != transferType) return false; DataBuffer buffer = r.getDataBuffer(); if (!dataBufferClass.isInstance(buffer)) return false; SampleModel model = r.getSampleModel(); if (!(model instanceof ComponentSampleModel)) return false; ComponentSampleModel csm = (ComponentSampleModel) model; int pixelStride = csm.getPixelStride(); if (pixelStride != 1) return false; int w = r.getWidth(); int scanlineStride = csm.getScanlineStride(); if (scanlineStride != w) return false; int c = r.getNumBands(); int[] bandOffsets = csm.getBandOffsets(); if (bandOffsets.length != c) return false; for (int i=0; i<bandOffsets.length; i++) { if (bandOffsets[i] != 0) return false; } for (int i=0; i<bandOffsets.length; i++) { if (bandOffsets[i] != i) return false; } return true; }
/** * Gets the raster's pixel data as arrays of primitives, one per channel. * The returned type will be either byte[][], short[][], int[][], float[][] * or double[][], depending on the raster's transfer type. */ public static Object getPixels(WritableRaster raster, int x, int y, int w, int h) { int tt = raster.getTransferType(); if (tt == DataBuffer.TYPE_BYTE) return getBytes(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_USHORT || tt == DataBuffer.TYPE_SHORT) { return getShorts(raster, x, y, w, h); } else if (tt == DataBuffer.TYPE_INT) return getInts(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_FLOAT) return getFloats(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_DOUBLE) { return getDoubles(raster, x, y, w, h); } else return null; }
/** * Gets the raster's pixel data as arrays of primitives, one per channel. * The returned type will be either byte[][], short[][], int[][], float[][] * or double[][], depending on the raster's transfer type. */ public static Object getPixels(WritableRaster raster, int x, int y, int w, int h) { int tt = raster.getTransferType(); if (tt == DataBuffer.TYPE_BYTE) return getBytes(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_USHORT || tt == DataBuffer.TYPE_SHORT) { return getShorts(raster, x, y, w, h); } else if (tt == DataBuffer.TYPE_INT) return getInts(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_FLOAT) return getFloats(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_DOUBLE) { return getDoubles(raster, x, y, w, h); } else return null; }
/** * Gets the raster's pixel data as arrays of primitives, one per channel. The * returned type will be either byte[][], short[][], int[][], float[][] or * double[][], depending on the raster's transfer type. */ public static Object getPixels(final WritableRaster raster, final int x, final int y, final int w, final int h) { final int tt = raster.getTransferType(); if (tt == DataBuffer.TYPE_BYTE) return getBytes(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_USHORT || tt == DataBuffer.TYPE_SHORT) { return getShorts(raster, x, y, w, h); } else if (tt == DataBuffer.TYPE_INT) return getInts(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_FLOAT) return getFloats(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_DOUBLE) { return getDoubles(raster, x, y, w, h); } else return null; }
/** * Gets the raster's pixel data as arrays of primitives, one per channel. * The returned type will be either byte[][], short[][], int[][], float[][] * or double[][], depending on the raster's transfer type. */ public static Object getPixels(WritableRaster raster, int x, int y, int w, int h) { int tt = raster.getTransferType(); if (tt == DataBuffer.TYPE_BYTE) return getBytes(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_USHORT || tt == DataBuffer.TYPE_SHORT) { return getShorts(raster, x, y, w, h); } else if (tt == DataBuffer.TYPE_INT) return getInts(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_FLOAT) return getFloats(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_DOUBLE) { return getDoubles(raster, x, y, w, h); } else return null; }
/** * Gets the raster's pixel data as arrays of primitives, one per channel. The * returned type will be either byte[][], short[][], int[][], float[][] or * double[][], depending on the raster's transfer type. */ public static Object getPixels(final WritableRaster raster, final int x, final int y, final int w, final int h) { final int tt = raster.getTransferType(); if (tt == DataBuffer.TYPE_BYTE) return getBytes(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_USHORT || tt == DataBuffer.TYPE_SHORT) { return getShorts(raster, x, y, w, h); } else if (tt == DataBuffer.TYPE_INT) return getInts(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_FLOAT) return getFloats(raster, x, y, w, h); else if (tt == DataBuffer.TYPE_DOUBLE) { return getDoubles(raster, x, y, w, h); } else return null; }
@Test public void testCreateCompatibleRaster() { int[] colors = createIntLut(1 << 8); IndexColorModel icm = new IndexColorModel(8, colors.length, colors, 0, false, -1, DataBuffer.TYPE_BYTE); ColorModel colorModel = new DiscreteAlphaIndexColorModel(icm); WritableRaster raster = colorModel.createCompatibleWritableRaster(3, 2); assertNotNull(raster); assertEquals(3, raster.getWidth()); assertEquals(2, raster.getHeight()); assertTrue(colorModel.isCompatibleRaster(raster)); assertThat(raster, CoreMatchers.is(WritableRaster.class)); // Specific subclasses are in sun.awt package assertThat(raster.getTransferType(), CoreMatchers.equalTo(DataBuffer.TYPE_BYTE)); }