return; int rows = imageDescriptor.getRows(); int cols = imageDescriptor.getColumns(); int samples = imageDescriptor.getSamples(); int bitsAllocated = imageDescriptor.getBitsAllocated(); int bitsStored = Math.min(imageDescriptor.getBitsStored(), destTransferSyntaxType.getMaxBitsStored()); boolean signed = imageDescriptor.isSigned() && destTransferSyntaxType.canEncodeSigned(); boolean banded = imageDescriptor.isBanded() || srcTransferSyntaxType == TransferSyntaxType.RLE; int dataType = bitsAllocated > 8 ? (signed ? DataBuffer.TYPE_SHORT : DataBuffer.TYPE_USHORT)
public boolean matches(String aeTitle, ImageDescriptor imageDescriptor) { return pmis.contains(imageDescriptor.getPhotometricInterpretation()) && matchBitStored(imageDescriptor.getBitsStored()) && matchPixelRepresentation(imageDescriptor.getPixelRepresentation()) && isEmptyOrContains(this.aeTitles, aeTitle) && isEmptyOrContains(this.sopClasses, imageDescriptor.getSopClassUID()) && isEmptyOrContains(this.bodyPartExamined, imageDescriptor.getBodyPartExamined()); }
private boolean endOfFrame() throws IOException { if (frameEndPos >= 0) return streamPos >= frameEndPos; if (streamPos < fragmEndPos) return false; if (readItemHeader() && !(imageDescriptor.isMultiframe() && fragmStartWord == frameStartWord)) return false; frameEndPos = streamPos; return true; }
private void nullifyUnusedBits() { if (imageDescriptor.getBitsStored() < imageDescriptor.getBitsAllocated()) { DataBuffer db = bi.getRaster().getDataBuffer(); switch (db.getDataType()) { case DataBuffer.TYPE_USHORT: nullifyUnusedBits(((DataBufferUShort) db).getData()); break; case DataBuffer.TYPE_SHORT: nullifyUnusedBits(((DataBufferShort) db).getData()); break; } } }
private void adjustDataset() { if (imageDescriptor.getSamples() == 3) { PhotometricInterpretation pmi = imageDescriptor.getPhotometricInterpretation(); int planarConfiguration = imageDescriptor.getPlanarConfiguration(); if (decompressor != null) { pmi = decompressorParam.pmiAfterDecompression(pmi); planarConfiguration = srcTransferSyntaxType.getPlanarConfiguration(); } if (compressor != null) { pmi = pmi.compress(destTransferSyntax); planarConfiguration = destTransferSyntaxType.getPlanarConfiguration(); } dataset.setString(Tag.PhotometricInterpretation, VR.CS, pmi.toString()); dataset.setInt(Tag.PlanarConfiguration, VR.US, planarConfiguration); } }
private PlanarImage getNativeImage(ImageReadParam param) throws IOException { StreamSegment seg = StreamSegment.getStreamSegment(iis, param); ImageDescriptor desc = seg.getImageDescriptor(); int dcmFlags = (canEncodeSigned && desc.isSigned()) ? Imgcodecs.DICOM_IMREAD_SIGNED : Imgcodecs.DICOM_IMREAD_UNSIGNED; // Force JPEG Baseline (1.2.840.10008.1.2.4.50) to YBR_FULL_422 color model when RGB (error made by some // constructors). RGB color model doesn't make sense for lossy jpeg. // http://dicom.nema.org/medical/dicom/current/output/chtml/part05/sect_8.2.html#sect_8.2.1 PhotometricInterpretation pmi = desc.getPhotometricInterpretation(); if (pmi.name().startsWith("YBR") || ("RGB".equalsIgnoreCase(pmi.name()) && params.getJpegMarker() == 0xffc0)) { dcmFlags |= Imgcodecs.DICOM_IMREAD_YBR; } if (seg instanceof FileStreamSegment) { MatOfDouble positions = new MatOfDouble(ExtendSegmentedInputImageStream.getDoubleArray(seg.getSegPosition())); MatOfDouble lengths = new MatOfDouble(ExtendSegmentedInputImageStream.getDoubleArray(seg.getSegLength())); return ImageCV.toImageCV(Imgcodecs.dicomJpgFileRead(((FileStreamSegment) seg).getFilePath(), positions, lengths, dcmFlags, Imgcodecs.IMREAD_UNCHANGED)); } else if (seg instanceof MemoryStreamSegment) { ByteBuffer b = ((MemoryStreamSegment) seg).getCache(); Mat buf = new Mat(1, b.limit(), CvType.CV_8UC1); buf.put(0, 0, b.array()); return ImageCV.toImageCV(Imgcodecs.dicomJpgMatRead(buf, dcmFlags, Imgcodecs.IMREAD_UNCHANGED)); } return null; }
private void decompressPixelData() throws IOException { int length = imageDescriptor.getLength(); int padding = length & 1; adjustDataset(); writeDataset(); dos.writeHeader(Tag.PixelData, VR.OW, length + padding); for (int i = 0; i < imageDescriptor.getFrames(); i++) { decompressFrame(i); writeFrame(); } if (padding != 0) dos.write(0); }
PhotometricInterpretation pi = desc.getPhotometricInterpretation(); params[Imgcodecs.DICOM_PARAM_BITS_PER_SAMPLE] = desc.getBitsStored(); // Bits per sample
private void nullifyUnusedBits(short[] data) { int mask = (1<<imageDescriptor.getBitsStored())-1; for (int i = 0; i < data.length; i++) data[i] &= mask; }
long[] offsets; int[] length; int frames = imageDescriptor.getFrames(); ArrayList<Integer> fragmentsPositions = new ArrayList<>();
private void initPixelDataFromAttributes(Attributes ds) { VR.Holder holder = new VR.Holder(); Object value = ds.getValue(Tag.PixelData, holder); if (value != null) { imageDescriptor = new ImageDescriptor(ds); pixelDataVR = holder.vr; if (value instanceof BulkData) { pixelData = (BulkData) value; pixelDataLength = pixelData.length(); } else if( value instanceof byte[] ) { pixeldataBytes = (byte[]) value; pixelDataLength = pixeldataBytes.length; } else { // value instanceof Fragments pixelDataFragments = (Fragments) value; pixelDataLength = -1; } } }
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); } }
private void compressPixelData() throws IOException { int padding = dis.length() - imageDescriptor.getLength(); for (int i = 0; i < imageDescriptor.getFrames(); i++) { if (decompressor == null) readFrame(); else bi = decompressFrame(i); if (i == 0) { extractEmbeddedOverlays(); adjustDataset(); writeDataset(); dos.writeHeader(Tag.PixelData, VR.OB, -1); dos.writeHeader(Tag.Item, null, 0); } nullifyUnusedBits(); compressFrame(i); } dis.skipFully(padding); dos.writeHeader(Tag.SequenceDelimitationItem, null, 0); }
params[Imgcodecs.DICOM_PARAM_BITS_PER_SAMPLE] = desc.getBitsStored(); // Bits per sample
@Override public void readValue(DicomInputStream dis, Attributes attrs) throws IOException { int tag = dis.tag(); if (dis.level() == 0 && tag == Tag.PixelData) { imageDescriptor = new ImageDescriptor(attrs); initDicomOutputStream(); processPixelData(); postPixelData = new Attributes(dis.bigEndian()); } else { dis.readValue(dis, attrs); if (postPixelData != null && dis.level() == 0) postPixelData.addSelected(attrs, attrs.getPrivateCreator(tag), tag); } }
params[Imgcodecs.DICOM_PARAM_BITS_PER_SAMPLE] = desc.getBitsStored(); // Bits per sample
List<Object> fragments = (List<Object>) ffragments.get(iis); Integer lastSegment = (Integer) flastSegment.get(iis); if (!desc.isMultiframe() && lastSegment < fragments.size()) { lastSegment = fragments.size();
this.frameLength = rows * cols * samples * bitsAllocated / 8; this.length = frameLength * frames; this.imageDescriptor = new ImageDescriptor(dataset);
Attributes ds = dis.readDataset(-1, Tag.PixelData); if (dis.tag() == Tag.PixelData) { imageDescriptor = new ImageDescriptor(ds); pixelDataVR = dis.vr(); pixelDataLength = dis.length(); Attributes ds = dis.readDataset(-1, Tag.PixelData); if( dis.tag() == Tag.PixelData ) { imageDescriptor = new ImageDescriptor(ds); pixelDataVR = dis.vr(); pixelDataLength = dis.length();