Java DCIM到JPG转换器的问题

Java DCIM到JPG转换器的问题,java,jpeg2000,Java,Jpeg2000,我已下载并正在运行以下代码: import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.Iterator; import javax.imageio.I

我已下载并正在运行以下代码:

import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class TestConverter {

public static void main(String... x) throws IOException, Exception{

    TestConverter.dicomToJpeg("C:\\Users\\xxxxx\\Desktop\\SCOUT\\IM-0001-0001.dcm");
}


public static void dicomToJpeg(String args) throws IOException, Exception {
    // TODO Auto-generated method stub      
    try 
    {               
        File myDicomFile = new File(args);
        BufferedImage myJpegImage = null;
        Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
        ImageReader reader = (ImageReader) iter.next();
        DicomImageReadParam param = null;
        try{                    
            param = (DicomImageReadParam) reader.getDefaultReadParam();
        }
        catch (Exception e) {                   
            e.printStackTrace();
        }
     ImageInputStream iis=ImageIO.createImageInputStream(myDicomFile);
               reader.setInput(iis, false);   
               myJpegImage = reader.read(0, param);   
               iis.close();
               if (myJpegImage == null) {
                      System.out.println("\nError: couldn't read dicom image!");
                      return;
                   }

               File myJpegFile = new File("d:/demo.jpg");   
               OutputStream output = new BufferedOutputStream(new FileOutputStream(myJpegFile));
               JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
               encoder.encode(myJpegImage);
               System.out.println("Image Create successufully");
               output.close();

        } 
        catch(IOException e){
           System.out.println("\nError: couldn't read dicom image!"+ e.getMessage());
           return;
        }
}
}
导入java.awt.image.buffereImage;
导入java.io.BufferedOutputStream;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.util.Iterator;
导入javax.imageio.imageio;
导入javax.imageio.ImageReader;
导入javax.imageio.stream.ImageInputStream;
导入org.dcm4che3.imageio.plugins.dcm.dicomimagereadpram;
导入com.sun.image.codec.jpeg.jpeg编解码器;
导入com.sun.image.codec.jpeg.jpeg图像编码器;
公共类TestConverter{
公共静态void main(字符串…x)抛出IOException,Exception{
TestConverter.dicomToJpeg(“C:\\Users\\xxxxx\\Desktop\\SCOUT\\IM-0001-0001.dcm”);
}
公共静态void dicomToJpeg(字符串args)引发IOException,Exception{
//TODO自动生成的方法存根
尝试
{               
File myDicomFile=新文件(args);
BuffereImage myJpegImage=null;
迭代器iter=ImageIO.getImageReadersByFormatName(“DICOM”);
ImageReader=(ImageReader)iter.next();
DicomImageReadParam param=null;
试试{
param=(DicomImageReadParam)reader.getDefaultReadParam();
}
捕获(例外e){
e、 printStackTrace();
}
ImageInputStream iis=ImageIO.createImageInputStream(myDicomFile);
reader.setInput(iis,false);
myJpegImage=reader.read(0,参数);
iis.close();
如果(myJpegImage==null){
System.out.println(“\n错误:无法读取dicom图像!”);
返回;
}
File myJpegFile=新文件(“d:/demo.jpg”);
OutputStream输出=新的BufferedOutputStream(新文件OutputStream(myJpegFile));
JPEGImageEncoder编码器=JPEGCodec.createJPEGEncoder(输出);
编码器。编码(MyJPEG图像);
System.out.println(“图像创建成功”);
output.close();
} 
捕获(IOE异常){
System.out.println(“\n错误:无法读取dicom图像!”+e.getMessage());
返回;
}
}
}
并得到以下异常

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.sun.medialib.codec.jp2k.Decoder.decode_init(Ljavax/imageio/stream/ImageInputStream;J)J
    at com.sun.medialib.codec.jp2k.Decoder.decode_init(Native Method)
    at com.sun.medialib.codec.jp2k.Decoder.<init>(Decoder.java:53)
    at com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib.<init>(J2KRenderedImageCodecLib.java:158)
    at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLib.read(J2KImageReaderCodecLib.java:367)
    at org.dcm4che3.imageio.plugins.dcm.DicomImageReader.read(DicomImageReader.java:281)
    at TestConverter.dicomToJpeg(TestConverter.java:43)
    at TestConverter.main(TestConverter.java:22)
线程“main”java.lang.unsatifiedLinkError中的异常:com.sun.medialib.codec.jp2k.Decoder.decode_init(Ljavax/imageio/stream/ImageInputStream;J)J 位于com.sun.medialib.codec.jp2k.Decoder.decode_init(本机方法) 在com.sun.medialib.codec.jp2k.Decoder上。(Decoder.java:53) 位于com.sun.media.imageioimpl.plugins.jpeg2000.J2KRenderedImageCodecLib(J2KRenderedImageCodecLib.java:158) 位于com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReaderCodecLib.read(J2KImageReaderCodecLib.java:367) 位于org.dcm4che3.imageio.plugins.dcm.DicomImageReader.read(DicomImageReader.java:281) 在TestConverter.dicomToJpeg(TestConverter.java:43) 位于TestConverter.main(TestConverter.java:22)
有人能帮忙吗?

我想,这取决于一些本机库(例如.dll文件)。您可以像下面这样为这些库添加代码

System.load("C:/pathMe/someLibrary.dll");

互联网上没有太多关于dcm4che3的信息,尤其是没有太多的例子。我在我的应用程序中使用这个库,并且遇到了同样的问题。我发现需要加载与映像IO库一起分发的本机库:

  • clib_jiio.dll
  • clib_jiio_sse2.dll
  • clib_jiio_util.dll
请注意,它们仅适用于Windows x64(和其他操作系统)


还有一件事,我将这些库保存在我的Jar中,在调用System.load(“libraryName”)之前,我需要从Jar中检索它并保存在临时文件中。

如果我使用这个dll,我的应用程序在处理压缩的dicom图像时经常崩溃。。。请帮帮我。。。。谢谢,请提供更多详细信息、堆栈跟踪、控制台输出等