【Java】DICOM を Java で、読み込み、Jpeg に変換 [2] (決定版)

DICOM を Java で、読み込み、Jpeg に変換 (決定版)

http://blogs.yahoo.co.jp/dk521123/6683637.html
での課題が結局、解決せず、以下のURLを参考に、別の方法に切り替える。
http://samucs.blogspot.com/2008/03/converting-dicom-to-jpeg-using-dcm4che.html

環境設定(外部JARなど)

なお、以下をダウンロードして、外部JARとして、ソースに取り込んでおく必要がある。

■ JAI ImageIO Toolkit

http://www.java2s.com/Code/Jar/JKL/Downloadjaiimageio11jar.htm
で「 jai_imageio-1.1.jar.zip」をダウンロードする 
もしくは、以下で、「jai-core-1.1.3-alpha.jar」および「jai_imageio-1.1-alpha.jar」をダウンロードする 
http://www.findjar.com/jar/geoserver/jai/jars/jai_imageio-1.1-alpha.jar.html
http://www.findjar.com/jar/geoserver/jai/jars/jai-core-1.1.3-alpha.jar.html

■ dcm4che (dcm4che-2.0.21-bin.zip)

http://sourceforge.net/projects/dcm4che/files/dcm4che2/
しかし、一部のDICOMファイルで、以下のようなエラーになる。
エラー内容
・・・省略・・・
Caused by: org.dcm4che2.data.ConfigurationError: No Image Reader of class com.sun.media.imageioimpl.plugins.jpeg.CLibJPEGImageReader available for format:jpeg
	at org.dcm4che2.imageio.ImageReaderFactory.getReaderForTransferSyntax(ImageReaderFactory.java:99)
	at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.initCompressedImageReader(DicomImageReader.java:332)
	at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.initImageReader(DicomImageReader.java:317)
	at org.dcm4che2.imageioimpl.plugins.dcm.DicomImageReader.read(DicomImageReader.java:479)
	at Converter.ConvertDicom.ConvertDicomToJpeg(ConvertDicom.java:73)
	... 1 more

CLibJPEGImageReaderクラスがないっと言っているっぽいので、
その周辺を色々調べたり、試したりしたところ、SUNが出している
「Java Advanced Imaging Image I/O Tools 1.1 Alpha」をインストールしてみたら、JPEGとして変換できた。 

Java Advanced Imaging Image I/O Tools 1.1 Alpha

 (jai_imageio-1_1-alpha-lib-windows-i586-jre.exe)
http://java.sun.com/products/java-media/jai/downloads/download-iio-1_1.html
 インストール後、「C:\Program Files\Java\jre6\bin」以下にある
画像入出力ライブラリ『clib_jiio.dll』を、Eclipseの作業ディレクトリ
(.projectや.classpathファイルが作られているディレクトリ)に置く。
http://blogs.yahoo.co.jp/dk521123/6843885.html
 なお、「C:\Program Files\Java\jre6\lib\ext」以下に保存される
『clibwrapper_jiio.jar』と『jai_imageio.jar』は、JAI ImageIO Toolkit(「jai-core-1.1.3-alpha.jar」
および「jai_imageio-1.1-alpha.jar」)の代用として、用いることができる。 '''

サンプル

testMain.jave

import Converter.ConvertDicom;

public class testMain {
    public static void main(String args[]) {    
        ConvertDicom dicom = new ConvertDicom();
        
        try {
            dicom.ConvertDicomToJpeg("C:\\dicomImage.dcm", "C:\\dicomImage.jpg" );
            
        } catch (Exception ex) {
            System.out.println("Failed... " + ex);
            ex.printStackTrace();
            return;
        }
        System.out.println("Success!" );
    }
}

ConvertDicom.java

package Converter;

import java.awt.image.BufferedImage;
import java.io.*;

import javax.imageio.*;
import javax.imageio.stream.ImageInputStream;

import org.apache.log4j.BasicConfigurator;
import org.dcm4che2.data.ConfigurationError;
import org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam;
import org.dcm4che2.io.DicomCodingException;

import com.sun.image.codec.jpeg.*;

import java.util.Iterator;

public class ConvertDicom {
    public ConvertDicom () {
    }

    /** 
     * To Convert Dicom To Jpeg
     *
     * @param inputFilePath input file path (DICOM File)
     * @param outputFilePath output file path (JPEG File)
     * @return true : SUCCESSFUL / false : FAIL
     * @exception Exception
     * @see <a href="USE">http://www.dcm4che.org/">USE dcm4che</a>
     * @version 0.0.1
     */
    public boolean ConvertDicomToJpeg(String inputFilePath, String outFilePath)
      throws Exception {
    	BasicConfigurator.configure();
    	
    	File dicomFile = new File(inputFilePath);
    	File jpegFile = new File(outFilePath);
    	
    	BufferedImage jpegImage = null;

    	/* To Read DICOM file */
    	Iterator<ImageReader> iter
    		= ImageIO.getImageReadersByFormatName("dicom" );
    	if (iter == null || !iter.hasNext()) {
    		return false; // Error : No data
    	}
    	ImageReader reader = (ImageReader)iter.next();
    	DicomImageReadParam param
    	    = (DicomImageReadParam)reader.getDefaultReadParam();
    	ImageInputStream iis
    		= ImageIO.createImageInputStream(dicomFile);  
    	reader.setInput(iis);

    	/* To create Jpeg file */
    	jpegImage = reader.read(0, param);
    	if (jpegImage == null) {
    	    return false; // Error : No data
    	}
    	OutputStream output
    		= new BufferedOutputStream(new FileOutputStream(jpegFile));
    	JPEGImageEncoder encoder
    		= JPEGCodec.createJPEGEncoder(output);
    	encoder.encode(jpegImage);
    	
    	/* Free Resource */
    	if (iis != null) iis.close();
    	if (output != null) output.close();
    }
}

関連記事

DICOM を Java で、読み込む [1]

http://blogs.yahoo.co.jp/dk521123/6683637.html