@Override public ImageReader createReaderInstance(Object extension) throws IOException { return new DicomImageReader(this); }
@Override public ImageTypeSpecifier getRawImageType(int frameIndex) throws IOException { readMetadata(); checkIndex(frameIndex); if (decompressor == null) return createImageType(bitsStored, dataType, banded); if (rle) return createImageType(bitsStored, dataType, true); openiis(); try { decompressor.setInput(iisOfFrame(0)); return decompressor.getRawImageType(0); } finally { closeiis(); } }
private ImageTypeSpecifier createImageType(int bits, int dataType, boolean banded) { return new ImageTypeSpecifier( createColorModel(bits, dataType), createSampleModel(dataType, banded)); }
@Override public int getWidth(int frameIndex) throws IOException { readMetadata(); checkIndex(frameIndex); return width; }
@Override public BufferedImage read(int frameIndex, ImageReadParam param) throws IOException { readMetadata(); checkIndex(frameIndex); openiis(); try { ImageInputStream iisOfFrame = iisOfFrame(frameIndex); BufferedImage bi = decompressor.read(0, decompressParam(param)); LOG.debug("Finished decompressing frame #{}", (frameIndex + 1)); if (samples > 1) closeiis(); raster = (WritableRaster) readRaster(frameIndex, param); int[] overlayGroupOffsets = getActiveOverlayGroupOffsets(param); byte[][] overlayData = new byte[overlayGroupOffsets.length][]; for (int i = 0; i < overlayGroupOffsets.length; i++) { overlayData[i] = extractOverlay(overlayGroupOffsets[i], raster); cm = createColorModel(8, DataBuffer.TYPE_BYTE); SampleModel sm = createSampleModel(DataBuffer.TYPE_BYTE, false); raster = applyLUTs(raster, frameIndex, param, sm, 8); for (int i = 0; i < overlayGroupOffsets.length; i++) { applyOverlay(overlayGroupOffsets[i], raster, frameIndex, param, 8, overlayData[i]);
@Override public Raster readRaster(int frameIndex, ImageReadParam param) throws IOException { readMetadata(); checkIndex(frameIndex); openiis(); try { if (decompressor != null) { decompressor.setInput(iisOfFrame(frameIndex)); ? decompressor.readRaster(0, decompressParam(param)) : decompressor.read(0, decompressParam(param)).getRaster(); if (LOG.isDebugEnabled()) LOG.debug("Finished decompressing frame #" + (frameIndex + 1)); createSampleModel(dataType, banded), null); DataBuffer buf = wr.getDataBuffer(); if (dis != null) { flushedFrames = frameIndex + 1; } else if (pixeldataBytes != null) { iis.setByteOrder(bigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN); iis.seek(frameIndex * frameLength); } else { iis.setByteOrder(bigEndian() ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN);
private ImageReadParam decompressParam(ImageReadParam param) { ImageReadParam decompressParam = decompressor.getDefaultReadParam(); ImageTypeSpecifier imageType = null; BufferedImage dest = null; if (param != null) { imageType = param.getDestinationType(); dest = param.getDestination(); } if (rle && imageType == null && dest == null) imageType = createImageType(bitsStored, dataType, true); decompressParam.setDestinationType(imageType); decompressParam.setDestination(dest); return decompressParam; }
@Override public int getHeight(int frameIndex) throws IOException { readMetadata(); checkIndex(frameIndex); return height; }
@Override public Iterator<ImageTypeSpecifier> getImageTypes(int frameIndex) throws IOException { readMetadata(); checkIndex(frameIndex); ImageTypeSpecifier imageType; if (pmi.isMonochrome()) imageType = createImageType(8, DataBuffer.TYPE_BYTE, false); else if (decompressor == null) imageType = createImageType(bitsStored, dataType, banded); else if (rle) imageType = createImageType(bitsStored, dataType, true); else { openiis(); try { decompressor.setInput(iisOfFrame(0)); return decompressor.getImageTypes(0); } finally { closeiis(); } } return Collections.singletonList(imageType).iterator(); }