static long getBufferSizeCSM(ComponentSampleModel csm) { int[] bandOffsets = csm.getBandOffsets(); int maxBandOff = bandOffsets[0]; for (int i = 1; i < bandOffsets.length; i++) maxBandOff = Math.max(maxBandOff, bandOffsets[i]); long size = 0; if (maxBandOff >= 0) size += maxBandOff + 1; int pixelStride = csm.getPixelStride(); if (pixelStride > 0) size += pixelStride * (csm.getWidth() - 1); int scanlineStride = csm.getScanlineStride(); if (scanlineStride > 0) size += scanlineStride * (csm.getHeight() - 1); return size; }
DataBuffer videoBuffer = new DataBufferByte(frame, frame.length); ComponentSampleModel sampleModel = new ComponentSampleModel(DataBuffer.TYPE_BYTE, width, height, 3, width * 3, new int[] {0, 1, 2}); this.grid = Raster.createWritableRaster(sampleModel, videoBuffer, null); ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), null, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); this.image = new BufferedImage(colorModel, this.grid, false, null);
private static long getNumBanksCSM(ComponentSampleModel csm) { int[] bankIndices = csm.getBankIndices(); int maxIndex = bankIndices[0]; for (int i = 1; i < bankIndices.length; i++) { int bankIndex = bankIndices[i]; if (bankIndex > maxIndex) { maxIndex = bankIndex; } } return maxIndex + 1; }
int[] bandOffsets = null; int bandSize = 0; int numBand = sampleModel.getNumBands(); int type = sampleModel.getDataType(); bandOffsets = csm.getBandOffsets(); for (int i = 0; i < numBand; i++) if (bandStride < bandOffsets[i]) bandStride = bandOffsets[i]; bankIndices = csm.getBankIndices(); for (int i = 0; i < numBand; i++) if (numBank < bankIndices[i]) double[] ddata = null; if (raster.getParent() != null && !sampleModel.equals(raster.getParent().getSampleModel())) { ras.setRect(raster); raster = ras; bdata = ((DataBufferByte)data).getData(); break; case DataBuffer.TYPE_SHORT: csm.getOffset(raster.getMinX()-raster.getSampleModelTranslateX(),
csm = (ComponentSampleModel)wr.getSampleModel(); final int width = wr.getWidth(); final int scanStride = csm.getScanlineStride(); final int pixStride = csm.getPixelStride(); final int [] bandOff = csm.getBandOffsets(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); final int base = (db.getOffset() + csm.getOffset(wr.getMinX() - wr.getSampleModelTranslateX(), wr.getMinY() - wr.getSampleModelTranslateY())); final byte[] pixels = db.getBankData()[0]; for (int y = 0; y < wr.getHeight(); y++) { int sp = base + y * scanStride;
public static ByteBuffer createImageBuffer(BufferedImage image) { SampleModel model = image.getSampleModel(); Raster raster = image.getRaster(); DataBuffer inBuffer = raster.getDataBuffer(); ByteBuffer outBuffer = ByteBuffer.allocateDirect(image.getWidth() * image.getHeight() * model.getNumBands()); int x = -raster.getSampleModelTranslateX(); int y = -raster.getSampleModelTranslateY(); int step = model.getWidth() * model.getNumBands(); int channels = model.getNumBands(); step = compModel.getScanlineStride(); channels = ((ComponentSampleModel) model).getPixelStride(); step = singleModel.getScanlineStride(); channels = 1; byte[] a = ((DataBufferByte) inBuffer).getData(); copy(ByteBuffer.wrap(a, start, a.length - start), step, outBuffer, step, false); int[] a = ((DataBufferInt) inBuffer).getData(); copy(IntBuffer.wrap(a, start, a.length - start), step, outBuffer.asIntBuffer(), step / 4);
Rectangle rgn = wr.getBounds(); rgn = rgn.intersection(alphaRed.getBounds()); csm = (ComponentSampleModel)r.getSampleModel(); final int alpScanStride = csm.getScanlineStride(); DataBufferByte alpDB = (DataBufferByte)r.getDataBuffer(); final int alpBase = (alpDB.getOffset() + csm.getOffset(rgn.x-r.getSampleModelTranslateX(), rgn.y-r.getSampleModelTranslateY())); final byte[] alpPixels = alpDB.getBankData()[0]; sppsm = (SinglePixelPackedSampleModel)wr.getSampleModel(); final int srcScanStride = sppsm.getScanlineStride(); DataBufferInt srcDB = (DataBufferInt)wr.getDataBuffer(); final int srcBase = (srcDB.getOffset() + sppsm.getOffset(rgn.x-wr.getSampleModelTranslateX(), rgn.y-wr.getSampleModelTranslateY())); final int[] srcPixels = srcDB.getBankData()[0];
public static void extractFromPixeldata(Raster raster, int mask, byte[] ovlyData, int off, int length) { ComponentSampleModel sm = (ComponentSampleModel) raster.getSampleModel(); int columns = raster.getWidth(); int stride = sm.getScanlineStride(); DataBuffer db = raster.getDataBuffer(); switch (db.getDataType()) { case DataBuffer.TYPE_BYTE: extractFromPixeldata(((DataBufferByte) db).getData(), columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_USHORT: extractFromPixeldata(((DataBufferUShort) db).getData(), columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_SHORT: extractFromPixeldata(((DataBufferShort) db).getData(), columns, stride, mask, ovlyData, off, length); break; default: throw new UnsupportedOperationException("Unsupported DataBuffer type: " + db.getDataType()); //$NON-NLS-1$ } }
dstOffset = csm.getOffset(-ras.getSampleModelTranslateX(), -ras.getSampleModelTranslateY()); scanlineStride = csm.getScanlineStride(); if(db instanceof DataBufferByte) { DataBufferByte dbb = (DataBufferByte)db; byteData = dbb.getData(); pixelBitStride = csm.getPixelStride()*8; isSupportedType = true; } else if(db instanceof DataBufferUShort) { pixelBitStride = csm.getPixelStride()*16; isSupportedType = true; } else if(db instanceof DataBufferShort) { pixelBitStride = csm.getPixelStride()*16; isSupportedType = true; } else if(db instanceof DataBufferInt) { DataBufferInt dbi = (DataBufferInt)db; intData = dbi.getData(); pixelBitStride = csm.getPixelStride()*32; isSupportedType = true; } else if(db instanceof DataBufferFloat) { pixelBitStride = csm.getPixelStride()*32; isSupportedType = true;
public static ImageCV toMat(RenderedImage img, Rectangle region, boolean toBGR) { Raster raster = region == null ? img.getData() : img.getData(region); DataBuffer buf = raster.getDataBuffer(); int[] samples = raster.getSampleModel().getSampleSize(); int[] offsets; if (raster.getSampleModel() instanceof ComponentSampleModel) { offsets = ((ComponentSampleModel) raster.getSampleModel()).getBandOffsets(); } else { offsets = new int[samples.length]; Mat b = new Mat(raster.getHeight(), raster.getWidth(), CvType.CV_8UC1); b.put(0, 0, ((DataBufferByte) buf).getData(2)); Mat g = new Mat(raster.getHeight(), raster.getWidth(), CvType.CV_8UC1); g.put(0, 0, ((DataBufferByte) buf).getData(1)); ImageCV r = new ImageCV(raster.getHeight(), raster.getWidth(), CvType.CV_8UC1); r.put(0, 0, ((DataBufferByte) buf).getData(0)); List<Mat> mv = toBGR ? Arrays.asList(b, g, r) : Arrays.asList(r, g, b); ImageCV dstImg = new ImageCV(raster.getHeight(), raster.getWidth(), CvType.CV_8UC3); } else if (buf instanceof DataBufferInt) { ImageCV mat = new ImageCV(raster.getHeight(), raster.getWidth(), CvType.CV_32SC(samples.length)); mat.put(0, 0, ((DataBufferInt) buf).getData()); return mat; } else if (buf instanceof DataBufferFloat) {
noTransform = destinationRegion.equals(originalRegion); numBands = sampleModel.getNumBands(); int[] bandOffsets = csm.getBandOffsets(); bandStride = bandOffsets[i]; int[] bankIndices = csm.getBankIndices(); int numBank = bankIndices[0]; for (int i = 1; i < bankIndices.length; i++) numBank = bankIndices[i]; pxlStride = csm.getPixelStride(); lineStride = csm.getScanlineStride(); (lineStride < pxlStride && lineStride == numBands) || (pxlStride < lineStride && lineStride == numBands * csm.getWidth()) || (lineStride < pxlStride && pxlStride == numBands * csm.getHeight()) || csm instanceof BandedSampleModel; } else if (sampleModel instanceof SinglePixelPackedSampleModel ||
int bitsPerPixel = sampleModel.getSampleSize()[0]; sampleModel instanceof ComponentSampleModel && image.getNumXTiles() == 1 && image.getNumYTiles() == 1 && image.getTile(0, 0).getDataBuffer() instanceof DataBufferByte; byte[] data = ((DataBufferByte)tile.getDataBuffer()).getData(); ComponentSampleModel csm = (ComponentSampleModel)tile.getSampleModel(); int offset = csm.getOffset(sourceXOffset - tile.getSampleModelTranslateX(), sourceYOffset - tile.getSampleModelTranslateY(), 0); int lineStride = csm.getScanlineStride(); byte[] data = ((DataBufferByte)tile.getDataBuffer()).getData(); ComponentSampleModel csm = (ComponentSampleModel)tile.getSampleModel(); int offset = csm.getOffset(sourceXOffset - tile.getSampleModelTranslateX(), sourceYOffset - tile.getSampleModelTranslateY(), 0); int lineStride = csm.getScanlineStride();
public RasterByteABGRProvider(Raster raster, boolean hasAlpha) { super(raster, 8, raster.getWidth() * (computePixelStride(raster, PIXEL_STRIDES, hasAlpha))); this.hasAlpha = hasAlpha; this.bytes = ((DataBufferByte) raster.getDataBuffer()).getData(); ComponentSampleModel sm = (ComponentSampleModel) raster.getSampleModel(); this.bgrOrder = sm.getBandOffsets()[0] != 0; this.pixelStride = sm.getPixelStride(); this.bandOffsets = sm.getBandOffsets(); this.numBands = sm.getNumBands(); }
private static int checkImg(BufferedImage img, int pf, int subsamp, TJScalingFactor sf, int flags) throws Exception { WritableRaster wr = img.getRaster(); int imgType = img.getType(); if(imgType == BufferedImage.TYPE_INT_RGB || imgType == BufferedImage.TYPE_INT_BGR || imgType == BufferedImage.TYPE_INT_ARGB || imgType == BufferedImage.TYPE_INT_ARGB_PRE) { SinglePixelPackedSampleModel sm = (SinglePixelPackedSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferInt db = (DataBufferInt)wr.getDataBuffer(); int[] buf = db.getData(); return checkIntBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, subsamp, sf, flags); } else { ComponentSampleModel sm = (ComponentSampleModel)img.getSampleModel(); int pitch = sm.getScanlineStride(); DataBufferByte db = (DataBufferByte)wr.getDataBuffer(); byte[] buf = db.getData(); return checkBuf(buf, img.getWidth(), pitch, img.getHeight(), pf, subsamp, sf, flags); } }
/** * Efficiently create a TYPE_BYTE_GRAY for display. This is typically much * faster than to create and display than an ARGB buffered image. * * @param img * the image to convert * @param ret * BufferedImage to draw into if possible. Can be null. * @return the converted image */ public static BufferedImage createBufferedImage(final FImage img, BufferedImage ret) { final int width = img.getWidth(); final int height = img.getHeight(); if (ret == null || ret.getWidth() != width || ret.getHeight() != height || ret.getType() != BufferedImage.TYPE_BYTE_GRAY) ret = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); final WritableRaster raster = ret.getRaster(); final float[][] p = img.pixels; final ComponentSampleModel sm = (ComponentSampleModel) raster.getSampleModel(); final DataBufferByte db = (DataBufferByte) raster.getDataBuffer(); final int scanlineStride = sm.getScanlineStride(); final int pixelStride = sm.getPixelStride(); final byte[] data = db.getData(); for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { data[y * scanlineStride + x * pixelStride] = (byte) (Math.max(0, Math.min(255, (int) (p[y][x] * 255)))); } } return ret; }
public void lookup(Raster src, Raster dst, int alpha, int channels, int skip) { int srcWidth = src.getWidth(); int dstWidth = dst.getWidth(); int srcHeight = src.getHeight(); int dstHeight = dst.getHeight(); dstScanlineStride = ((MultiPixelPackedSampleModel)destSm).getScanlineStride(); } else { srcScanlineStride = ((ComponentSampleModel)sourceSm).getScanlineStride(); dstScanlineStride = ((ComponentSampleModel)destSm).getScanlineStride(); byte[][] data = ((DataBufferByte) dstdata).getBankData(); for (int bank = 0; bank < data.length; bank++) { lookup(srcdata, srcWidth, srcHeight, srcScanlineStride, case DataBuffer.TYPE_INT: lookup(srcdata, srcScanlineStride, srcHeight, srcScanlineStride, ((DataBufferInt) dstdata).getData(), dstScanlineStride, alpha); break; default:
public static long getBandSize(SampleModel sm) { int elementSize = DataBuffer.getDataTypeSize(sm.getDataType()); if (sm instanceof ComponentSampleModel) { ComponentSampleModel csm = (ComponentSampleModel)sm; int pixelStride = csm.getPixelStride(); int scanlineStride = csm.getScanlineStride(); long size = Math.min(pixelStride, scanlineStride); if (pixelStride > 0) size += pixelStride * (sm.getWidth() - 1); if (scanlineStride > 0) size += scanlineStride * (sm.getHeight() - 1); return size * ((elementSize + 7) / 8); } else return getTileSize(sm); }
public static long getTileSize(SampleModel sm) { int elementSize = DataBuffer.getDataTypeSize(sm.getDataType()); } else if (sm instanceof ComponentSampleModel) { ComponentSampleModel csm = (ComponentSampleModel)sm; int[] bandOffsets = csm.getBandOffsets(); int maxBandOff = bandOffsets[0]; for (int i=1; i<bandOffsets.length; i++) int pixelStride = csm.getPixelStride(); int scanlineStride = csm.getScanlineStride(); if (maxBandOff >= 0) size += maxBandOff + 1; if (pixelStride > 0) size += pixelStride * (sm.getWidth() - 1); if (scanlineStride > 0) size += scanlineStride * (sm.getHeight() - 1); int[] bankIndices = csm.getBankIndices(); maxBandOff = bankIndices[0]; for (int i=1; i<bankIndices.length; i++) SinglePixelPackedSampleModel sppsm = (SinglePixelPackedSampleModel)sm; long size = sppsm.getScanlineStride() * (sppsm.getHeight() - 1) + sppsm.getWidth(); return size * ((elementSize + 7) / 8);
private int maxDiff(WritableRaster raster, WritableRaster raster2) { ComponentSampleModel csm = (ComponentSampleModel) raster.getSampleModel(); ComponentSampleModel csm2 = (ComponentSampleModel) raster2.getSampleModel(); DataBuffer db = raster.getDataBuffer(); DataBuffer db2 = raster2.getDataBuffer(); int blockSize = avgPixelValueBlockSize; if (blockSize > 1) { int w = csm.getWidth(); int h = csm.getHeight(); int maxY = (h / blockSize - 1) * blockSize; int maxX = (w / blockSize - 1) * blockSize; int[] samples = new int[blockSize * blockSize]; int diff, maxDiff = 0; for (int b = 0; b < csm.getNumBands(); b++) for (int y = 0; y < maxY; y += blockSize) { for (int x = 0; x < maxX; x += blockSize) { if (maxDiff < (diff = Math.abs( sum(csm.getSamples( x, y, blockSize, blockSize, b, samples, db)) - sum(csm2.getSamples( x, y, blockSize, blockSize, b, samples, db2))))) maxDiff = diff; return maxDiff(csm, ((DataBufferByte) db).getBankData(), csm2, ((DataBufferByte) db2).getBankData()); case DataBuffer.TYPE_USHORT: return maxDiff(csm, ((DataBufferUShort) db).getData(),
/** * Create and return an adapted default read and write raster iterator. * Iterator move in a raster sub-area. * * @param raster {@link Raster} will be traveled by read-only iterator. * @param writeableRaster {@link WritableRaster} raster wherein value is set (write). * @param subArea {@link Rectangle} which define raster read and write area. * @return adapted {@link PixelIterator}. */ public static PixelIterator createDefaultWriteableIterator(final Raster raster, final WritableRaster writeableRaster, final Rectangle subArea) { final SampleModel srcSampleM = raster.getSampleModel(); final SampleModel destSampleM = raster.getSampleModel(); PixelIterator.checkRasters(raster, writeableRaster); if (srcSampleM instanceof ComponentSampleModel && destSampleM instanceof ComponentSampleModel) { ComponentSampleModel srcCSModel = (ComponentSampleModel) srcSampleM; ComponentSampleModel destCSModel = (ComponentSampleModel) destSampleM; // Source and destination image must have identical structure in order to allow a single iterator to move through them. if (checkBankIndices(srcCSModel.getBankIndices()) && checkBankIndices(destCSModel.getBankIndices()) && Arrays.equals(srcCSModel.getBandOffsets(), destCSModel.getBandOffsets()) && srcCSModel.getPixelStride() == destCSModel.getPixelStride() && srcCSModel.getScanlineStride() == destCSModel.getScanlineStride()) { switch (srcSampleM.getDataType()) { case DataBuffer.TYPE_BYTE : return new DefaultWritableDirectByteIterator(raster, writeableRaster, subArea); case DataBuffer.TYPE_FLOAT : return new DefaultWritableDirectFloatIterator(raster, writeableRaster, subArea); default : return new DefaultWritableIterator(raster, writeableRaster, subArea); } } } return new DefaultWritableIterator(raster, writeableRaster, subArea); }