private int[] getActiveOverlayGroupOffsets(ImageReadParam param) { if (param instanceof DicomImageReadParam) { DicomImageReadParam dParam = (DicomImageReadParam) param; Attributes psAttrs = dParam.getPresentationState(); if (psAttrs != null) return Overlays.getActiveOverlayGroupOffsets(psAttrs); else return Overlays.getActiveOverlayGroupOffsets( metadata.getAttributes(), dParam.getOverlayActivationMask()); } return Overlays.getActiveOverlayGroupOffsets(metadata.getAttributes(), 0xffff); }
private void applyOverlay( int gg0000, WritableRaster raster, int frameIndex, ImageReadParam param, int outBits, byte[] ovlyData) { Attributes ovlyAttrs = metadata.getAttributes(); int grayscaleValue = 0xffff; if (param instanceof DicomImageReadParam) { DicomImageReadParam dParam = (DicomImageReadParam) param; Attributes psAttrs = dParam.getPresentationState(); if (psAttrs != null) { if (psAttrs.containsValue(Tag.OverlayData | gg0000)) ovlyAttrs = psAttrs; grayscaleValue = Overlays.getRecommendedDisplayGrayscaleValue(psAttrs, gg0000); } else grayscaleValue = dParam.getOverlayGrayscaleValue(); } Overlays.applyOverlay( ovlyData != null ? 0 : frameIndex, raster, ovlyAttrs, gg0000, grayscaleValue >>> (16 - outBits), ovlyData); }
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)]; Overlays.extractFromPixeldata(raster, mask, ovlyData, 0, length); return ovlyData; }
private WritableRaster applyLUTs( WritableRaster raster, int frameIndex, ImageReadParam param, SampleModel sm, int outBits) { WritableRaster destRaster = sm.getDataType() == raster.getSampleModel().getDataType() ? raster : Raster.createWritableRaster(sm, null); Attributes imgAttrs = metadata.getAttributes(); StoredValue sv = StoredValue.valueOf(imgAttrs); LookupTableFactory lutParam = new LookupTableFactory(sv); DicomImageReadParam dParam = param instanceof DicomImageReadParam ? (DicomImageReadParam) param : new DicomImageReadParam(); Attributes psAttrs = dParam.getPresentationState(); if (psAttrs != null) { lutParam.setModalityLUT(psAttrs); lutParam.setVOI( selectVOILUT(psAttrs, imgAttrs.getString(Tag.SOPInstanceUID), frameIndex + 1), 0, 0, false); lutParam.setPresentationLUT(psAttrs); } else { Attributes sharedFctGroups = imgAttrs.getNestedDataset(Tag.SharedFunctionalGroupsSequence); Attributes frameFctGroups = imgAttrs.getNestedDataset(Tag.PerFrameFunctionalGroupsSequence, frameIndex); lutParam.setModalityLUT( selectFctGroup( imgAttrs, sharedFctGroups, frameFctGroups, Tag.PixelValueTransformationSequence)); if (dParam.getWindowWidth() != 0) { lutParam.setWindowCenter(dParam.getWindowCenter()); lutParam.setWindowWidth(dParam.getWindowWidth()); } else lutParam.setVOI( selectFctGroup(imgAttrs, sharedFctGroups, frameFctGroups, Tag.FrameVOILUTSequence), dParam.getWindowIndex(), dParam.getVOILUTIndex(), dParam.isPreferWindow()); if (dParam.isAutoWindowing()) lutParam.autoWindowing(imgAttrs, raster); lutParam.setPresentationLUT(imgAttrs); } LookupTable lut = lutParam.createLUT(outBits); lut.lookup(raster, destRaster); return destRaster; }
private ColorModel createColorModel(int bits, int dataType) { return pmi.createColorModel(bits, dataType, metadata.getAttributes()); }