public static void extractFromPixeldata(Raster raster, int mask, byte[] ovlyData, int off, int length) { ComponentSampleModel sm = (ComponentSampleModel) raster.getSampleModel(); int rows = raster.getHeight(); int columns = raster.getWidth(); int stride = sm.getScanlineStride(); DataBuffer db = raster.getDataBuffer(); switch (db.getDataType()) { case DataBuffer.TYPE_BYTE: extractFromPixeldata(((DataBufferByte) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_USHORT: extractFromPixeldata(((DataBufferUShort) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_SHORT: extractFromPixeldata(((DataBufferShort) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; default: throw new UnsupportedOperationException( "Unsupported DataBuffer type: " + db.getDataType()); } }
public static void extractFromPixeldata(Raster raster, int mask, byte[] ovlyData, int off, int length) { ComponentSampleModel sm = (ComponentSampleModel) raster.getSampleModel(); int rows = raster.getHeight(); int columns = raster.getWidth(); int stride = sm.getScanlineStride(); DataBuffer db = raster.getDataBuffer(); switch (db.getDataType()) { case DataBuffer.TYPE_BYTE: extractFromPixeldata(((DataBufferByte) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_USHORT: extractFromPixeldata(((DataBufferUShort) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; case DataBuffer.TYPE_SHORT: extractFromPixeldata(((DataBufferShort) db).getData(), rows, columns, stride, mask, ovlyData, off, length); break; default: throw new UnsupportedOperationException( "Unsupported DataBuffer type: " + db.getDataType()); } }
private void extractEmbeddedOverlays(int frameIndex, BufferedImage bi) { for (int gg0000 : embeddedOverlays) { int ovlyRow = dataset.getInt(Tag.OverlayRows | gg0000, 0); int ovlyColumns = dataset.getInt(Tag.OverlayColumns | gg0000, 0); int ovlyBitPosition = dataset.getInt(Tag.OverlayBitPosition | gg0000, 0); int mask = 1 << ovlyBitPosition; int ovlyLength = ovlyRow * ovlyColumns; byte[] ovlyData = dataset.getSafeBytes(Tag.OverlayData | gg0000); if (ovlyData == null) { ovlyData = new byte[(((ovlyLength*frames+7)>>>3)+1)&(~1)]; dataset.setBytes(Tag.OverlayData | gg0000, VR.OB, ovlyData); } Overlays.extractFromPixeldata(bi.getRaster(), mask, ovlyData, ovlyLength * frameIndex, ovlyLength); LOG.debug("Extracted embedded overlay #{} from bit #{} of frame #{}", new Object[]{(gg0000 >>> 17) + 1, ovlyBitPosition, frameIndex + 1}); } }
private byte[] extractOverlay(int gg0000, WritableRaster raster) { Attributes attrs = metadata.getAttributes(); if (attrs.getInt(Tag.OverlayBitsAllocated | gg0000, 1) == 1) return null; int ovlyRows = attrs.getInt(Tag.OverlayRows | gg0000, 0); int ovlyColumns = attrs.getInt(Tag.OverlayColumns | gg0000, 0); int bitPosition = attrs.getInt(Tag.OverlayBitPosition | gg0000, 0); int mask = 1<<bitPosition; int length = ovlyRows * ovlyColumns; byte[] ovlyData = new byte[(((length+7)>>>3)+1)&(~1)] ; if (bitPosition < bitsStored) LOG.info("Ignore embedded overlay #{} from bit #{} < bits stored: {}", (gg0000 >>> 17) + 1, bitPosition, bitsStored); else Overlays.extractFromPixeldata(raster, mask, ovlyData, 0, length); return ovlyData; }
private void extractEmbeddedOverlays() { for (int gg0000 : imageDescriptor.getEmbeddedOverlays()) { int ovlyRow = dataset.getInt(Tag.OverlayRows | gg0000, 0); int ovlyColumns = dataset.getInt(Tag.OverlayColumns | gg0000, 0); int ovlyBitPosition = dataset.getInt(Tag.OverlayBitPosition | gg0000, 0); int mask = 1 << ovlyBitPosition; int ovlyLength = ovlyRow * ovlyColumns; byte[] ovlyData = new byte[(((ovlyLength+7)>>>3)+1)&(~1)]; Overlays.extractFromPixeldata(bi.getRaster(), mask, ovlyData, 0, ovlyLength); dataset.setInt(Tag.OverlayBitsAllocated | gg0000, VR.US, 1); dataset.setInt(Tag.OverlayBitPosition | gg0000, VR.US, 0); dataset.setBytes(Tag.OverlayData | gg0000, VR.OB, ovlyData); LOG.debug("Extracted embedded overlay #{} from bit #{}", (gg0000 >>> 17) + 1, ovlyBitPosition); } }