Java rawImageInputStream不能转换为-imageIO

时间:2016-09-11 13:36:41

标签: java javax.imageio dcm4che

我正在开发一种图像转换器,可将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,请帮忙。

2 个答案:

答案 0 :(得分:1)

  

我很确定这是因为我的项目中有多个imageIO Jars

专注于。

问题似乎是DicomImageReader创建了一个新的RawImageInputStream(来自com.sun.media.imageio.stream),但是在RAW {{1}上执行了查找 }:

ImageReader

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

因为两个JAR都包含用于RAW图像读取的服务提供程序(SPI),并且默认情况下没有特定的排序,所以RawImageInputStream riis = new RawImageInputStream(...) ... reader = ImageIO.getImageReadersByFormatName("RAW").next(); reader.setInput(riis); ImageReader将在运行时使用的实际DicomImageReader未定义(但是在你的堆栈跟踪的情况下,它显然是错误的)。长期的最佳解决方案可能是更新DicomImageReader以确保它获得正确的RawImageReader(与输入兼容的那个),但集成这样的更改通常需要更多时间,我将在下面概述一种解决方法。

您写道,您需要在项目中同时使用两个JAR,但如果您不需要来自两个JAR的RAW图像阅读器,则可以取消注册com.github.jaiimageio包中的JAR。

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

答案 1 :(得分:0)

结束废弃整个代码块并改为使用以下库:

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

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