2

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 があるためだと確信しています。助けてください。

4

2 に答える 2

1

これは、プロジェクトに複数の imageIO Jar があるためだと確信しています。

スポット。

問題は、 が(from から)DicomImageReader新しいものを作成するが、 RAWをルックアップすることのようです:RawImageInputStreamcom.sun.media.imageio.streamImageReader

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

(コードはDicomImageReader.java、initRawImageReaderメソッドから取得)。

両方の JAR に RAW 画像読み取り用のサービス プロバイダー (SPI) が含まれており、既定では特定の順序がないため、実行時に実際ImageReaderDicomImageReader使用されるものは未定義です (ただし、スタック トレースの場合は明らかに間違っています)。長期的な最善の解決策は、おそらく をDicomImageReader更新して正しいRawImageReader(入力と互換性のあるもの) を取得することですが、そのような変更を統合するには通常より時間がかかるため、以下に回避策の概要を示します。

プロジェクトに両方の JAR が必要であると書いていますが、両方の JAR の RAW イメージ リーダーが必要ない場合は、com.github.jaiimageioパッケージから 1 つを登録解除できます。

実行時に SPI を登録解除または注文する方法の詳細については、この回答を参照してください。その質問の SPI は TIFF 形式用ですが、概念は同じです。の登録を解除com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpiするか、com.sun.media.imageio.impl.plugins.raw.RawImageReaderSpiが最初に注文されていることを確認してください。

フォルダ内のエントリを編集することで、JAR 内の SPI の登録を停止することもできMETA-INF/services/ます。のエントリがあるはずですMETA-INF/services/javax.imageio.spi.ImageReaderSpi。.#com.github.jaiimageio.impl.plugins.raw.RawImageReaderSpi

于 2016-09-12T08:16:07.790 に答える
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);
}

文字通り同じことを行いますが、はるかに簡単です。

于 2016-09-12T20:14:21.353 に答える