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;
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;
}