【问题标题】:Java rawImageInputStream cannot be cast -imageIOJava rawImageInputStream 不能转换 -imageIO
【发布时间】:2016-09-11 13:36:41
【问题描述】:

我正在开发一个图像转换器,它将 DICOM 格式的图像转换为 PNG 格式。

@SuppressWarnings("restriction")
    public void dcmconvpng(File file, int indice, File fileOutput)
            throws IOException {        
        ImageIO.scanForPlugins();
        Iterator<ImageReader> iter = ImageIO
                .getImageReadersByFormatName("DICOM");
        ImageReader readers = (ImageReader) iter.next();
        DicomImageReadParam param = (DicomImageReadParam) readers
                .getDefaultReadParam();

        ImageInputStream iis = ImageIO.createImageInputStream(file);
        readers.setInput(iis, true);
        myPngImage = readers.read(indice, param);
        BufferedImage dimg = myPngImage;

        File myPngFile = fileOutput;
        OutputStream output = new BufferedOutputStream(new FileOutputStream(
                myPngFile));
        PNGEncodeParam.RGB param2 = new PNGEncodeParam.RGB();
        ImageEncoder enc = ImageCodec.createImageEncoder("PNG", output, param2);
        enc.encode(dimg);
        output.close();
        System.out.println("Conversion has been completed!");

    }

它在过去一直有效 - 但是,自从我将 jai_imageio-core-1.3.1.jar 添加到我的库中(我在项目的其他地方需要 OCR 系统)后,我收到以下错误:

Exception in thread "main" java.lang.ClassCastException: com.sun.media.imageio.stream.RawImageInputStream cannot be cast to com.github.jaiimageio.stream.RawImageInputStream
    at com.github.jaiimageio.impl.plugins.raw.RawImageReader.setInput(RawImageReader.java:106)
    at javax.imageio.ImageReader.setInput(ImageReader.java:380)
    at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.initRawImageReader(DicomImageReader.java:371)
    at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.initImageReader(DicomImageReader.java:339)
    at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.read(DicomImageReader.java:530)

我很确定这是由于我的项目中有多个 imageIO Jars,请提供任何帮助。

【问题讨论】:

  • 我注意到它只转换了 3 张图像,但仅此而已。

标签: java javax.imageio dcm4che


【解决方案1】:

我很确定这是由于我的项目中有多个 imageIO Jars

准点。

问题似乎是DicomImageReader 创建了一个新的RawImageInputStream(来自com.sun.media.imageio.stream),但是查找 RAW ImageReader

RawImageInputStream riis = new RawImageInputStream(...)
...
reader = ImageIO.getImageReadersByFormatName("RAW").next();
reader.setInput(riis);

(代码取自DicomImageReader.java, initRawImageReader method)。

因为您的两个 JAR 都包含用于读取 RAW 图像的服务提供程序 (SPI),并且默认情况下没有特定的顺序,所以在运行时实际使用的 ImageReaderDicomImageReader 是未定义的(但在您的堆栈的情况下)跟踪,这显然是错误的)。从长远来看,最好的解决方案可能是更新DicomImageReader 以确保它获得正确的RawImageReader(与输入兼容的),但集成这样的更改通常需要更多时间,所以我'将在下面概述一种解决方法。

您写道,您的项目中需要两个 JAR,但如果您不需要两个 JAR 中的 RAW 图像阅读器,您可以从 com.github.jaiimageio 包中取消注册一个。

this answer for details on how to unregister or order SPIs at runtime。该问题中的 SPI 适用于 TIFF 格式,但概念是相同的。您应该取消注册com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpi,或确保先订购com.sun.media.imageio.impl.plugins.raw.RawImageReaderSpi

也可以通过编辑META-INF/services/ 文件夹中的条目来阻止JAR 中的SPI 注册。应该有一个META-INF/services/javax.imageio.spi.ImageReaderSpi 的条目,您应该删除或注释掉(使用#com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpi

【讨论】:

  • 您好 haraldK,感谢您的回复。我已尝试实施您在另一篇文章中提供的方法,但无济于事,并继续出现相同的错误。然后我把你建议的那行注释掉了,程序仍然继续产生同样的错误。
  • 只是一些背景知识。如果库 jai-imageio-core-1.3.1.jar 但保留 jai_imageio-1.1.jar,我的转换器会运行,但是我需要 imageio 的其他方法会产生错误:NoClassDefFoundError: com/github/jaiimageio/plugins/tiff/TIFFImageWriteParam
  • 您是否在 Web 容器中运行您的应用程序?
  • 不,我不是,我只是在使用常规的 Java 控制台应用程序。这是我的回购。 github.com/mazenSehg/DIC2PNG
  • 嗯...我非常有信心,如果正确实施,我建议的变通办法会奏效。可能是ImageIO.scanForPlugins() 重新添加了提供者,或者有更多麻烦的提供者。但是,如果您找到了解决此问题的其他方法,那我就离开它。 :-)
【解决方案2】:

最终废弃了整个代码块并改用了以下库:

  • pixelmed.jar
  • vecmath-1.5.2.jar

并使用了以下代码:

public void dcmconvpng(File file, int indice, File fileOutput)
        throws IOException, DicomException {

    ConsumerFormatImageMaker.convertFileToEightBitImage(file.toString(),
            fileOutput.toString(), "png", indice);
}

它确实做同样的事情,只是更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2016-01-09
    • 1970-01-01
    相关资源
    最近更新 更多