Java 无法转换 rawImageInputStream -imageIO
Java rawImageInputStream cannot be cast -imageIO
我正在开发一个图像转换器,可以将 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 Jar,请帮忙。
I am pretty sure that this is due to the multiple imageIO Jars I have in my project
正确。
问题似乎是 DicomImageReader
创建了一个新的 RawImageInputStream
(来自 com.sun.media.imageio.stream
),但是 lookup原始 ImageReader
:
RawImageInputStream riis = new RawImageInputStream(...)
...
reader = ImageIO.getImageReadersByFormatName("RAW").next();
reader.setInput(riis);
(代码取自 DicomImageReader.java, initRawImageReader
method)。
由于您的两个 JAR 都包含用于读取 RAW 图像的服务提供程序 (SPI),并且默认情况下没有特定的顺序,因此 DicomImageReader
将在运行时使用的实际 ImageReader
未定义(但在你的堆栈跟踪的情况下,它显然是错误的)。从长远来看,最好的解决方案可能是更新 DicomImageReader
以确保它获得正确的 RawImageReader
(与输入兼容的),但集成这样的更改通常需要更多时间,因此我将在下面概述解决方法。
您写道您的项目中需要这两个 JAR,但是如果您不需要来自两个 JAR 的 RAW 图像 reader,您可以从 com.github.jaiimageio
包中注销那个.
参见 。该问题中的 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
.
最终废弃了整个代码块并改用以下库:
- 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);
}
它实际上做同样的事情,只是更容易。
我正在开发一个图像转换器,可以将 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 Jar,请帮忙。
I am pretty sure that this is due to the multiple imageIO Jars I have in my project
正确。
问题似乎是 DicomImageReader
创建了一个新的 RawImageInputStream
(来自 com.sun.media.imageio.stream
),但是 lookup原始 ImageReader
:
RawImageInputStream riis = new RawImageInputStream(...)
...
reader = ImageIO.getImageReadersByFormatName("RAW").next();
reader.setInput(riis);
(代码取自 DicomImageReader.java, initRawImageReader
method)。
由于您的两个 JAR 都包含用于读取 RAW 图像的服务提供程序 (SPI),并且默认情况下没有特定的顺序,因此 DicomImageReader
将在运行时使用的实际 ImageReader
未定义(但在你的堆栈跟踪的情况下,它显然是错误的)。从长远来看,最好的解决方案可能是更新 DicomImageReader
以确保它获得正确的 RawImageReader
(与输入兼容的),但集成这样的更改通常需要更多时间,因此我将在下面概述解决方法。
您写道您的项目中需要这两个 JAR,但是如果您不需要来自两个 JAR 的 RAW 图像 reader,您可以从 com.github.jaiimageio
包中注销那个.
参见 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
.
最终废弃了整个代码块并改用以下库:
- 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);
}
它实际上做同样的事情,只是更容易。