OpenCV codecs - ImageInputStream to BufferedImage error

282 views
Skip to first unread message

Pavel Navrkal

unread,
Jul 15, 2019, 1:34:25 PM7/15/19
to dcm4che
Hi Nicolas,
if I use dcm4che with OpenCV codecs, I have problem to convert ImageInputStream created from general InputStream to jpeg. The error ocures if:

- ImageInputStream is constructed with general java InputStream, not with File() as input
- Input DICOM image is multiframe in jpeg TS (MF IVRLE files works OK)

I get this error:
19:14:59.955 [main] DEBUG org.dcm4che3.imageio.plugins.dcm.DicomImageReader - Decompressor: org.dcm4che3.opencv.NativeImageReader
19:14:59.962 [main] DEBUG org.dcm4che3.imageio.stream.SegmentedInputImageStream - wasPos 0 end 9223372036854775807
19:14:59.963 [main] DEBUG org.dcm4che3.imageio.plugins.dcm.DicomImageReader - Start decompressing frame #2
Exception in thread "main" java.lang.IllegalArgumentException: Width (0) and height (0) must be > 0
    at java
.awt.image.SampleModel.<init>(SampleModel.java:126)
    at java
.awt.image.ComponentSampleModel.<init>(ComponentSampleModel.java:146)
    at java
.awt.image.PixelInterleavedSampleModel.<init>(PixelInterleavedSampleModel.java:87)
    at java
.awt.image.Raster.createInterleavedRaster(Raster.java:641)
    at java
.awt.image.Raster.createInterleavedRaster(Raster.java:278)
    at java
.awt.image.Raster.createInterleavedRaster(Raster.java:212)
    at java
.awt.image.ComponentColorModel.createCompatibleWritableRaster(ComponentColorModel.java:2825)
    at org
.weasis.opencv.op.ImageConversion.toBufferedImage(ImageConversion.java:79)
    at org
.weasis.opencv.op.ImageConversion.toBufferedImage(ImageConversion.java:116)
    at org
.dcm4che3.opencv.NativeImageReader.read(NativeImageReader.java:252)
    at org
.dcm4che3.imageio.plugins.dcm.DicomImageReader.read(DicomImageReader.java:455)
    at org
.medoro.Test.main(Test.java:24)

Minimal example java code:
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class Test {

   
public static void main(String[] args) throws IOException {
       
ImageReader reader = ImageIO.getImageReadersByFormatName("DICOM").next();

       
ByteArrayInputStream is = new ByteArrayInputStream(Files.readAllBytes(new File("/tmp/test.dcm").toPath()));

       
try (ImageInputStream iis = ImageIO.createImageInputStream(is)) {
            reader
.setInput(iis, false);
            reader
.read(1, reader.getDefaultReadParam());
       
}
   
}
}



Tested DICOM image is in attachement.

Pavel
test.dcm

Nicolas Roduit

unread,
Jul 21, 2019, 4:53:43 PM7/21/19
to dcm4che
Prefer to use DicomInputStream instead of ImageIO.createImageInputStream() because there is a cache mechanism.

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;

import org.dcm4che3.io.DicomInputStream;

public class Test {

    public static void main(String[] args) throws IOException {

        ImageReader reader = ImageIO.getImageReadersByFormatName("DICOM").next();
        
        byte[] data = Files.readAllBytes(Paths.get("/tmp/test.dcm"));
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data);
        DicomInputStream dicomStream = new DicomInputStream(byteArrayInputStream);
        reader.setInput(dicomStream);
        BufferedImage bi = reader.read(1, reader.getDefaultReadParam());
    }
}


Pavel Navrkal

unread,
Jul 29, 2019, 7:42:09 AM7/29/19
to dcm4che
Wrapping the stream by DicomInputStream fix the issue.
Thanks.
Pavel

Dne neděle 21. července 2019 22:53:43 UTC+2 Nicolas Roduit napsal(a):
Reply all
Reply to author
Forward
0 new messages