将DICOM图像转换为JPEG图像。

6

我的代码是

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.dcm4che2.imageio.plugins.dcm.DicomImageReadParam;    
import com.sun.image.codec.jpeg.JPEGCodec;    
import com.sun.image.codec.jpeg.JPEGImageEncoder;

public class DicomToJpeg {    
    public static void main(String args[]) throws IOException, Exception
    {
        dicomToJpeg("d:/F74AFBC7");
    }

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

当我在使用Eclipse的Java项目中执行它时,它可以正常工作... 但是当我在Web应用程序中执行并从控制器页面调用它时,如下所示:

DicomToJpeg.dicomToJpeg("d:/F74AFBC7");

然后它会报错...
java.util.NoSuchElementException
    at javax.imageio.spi.FilterIterator.next(Unknown Source)
    at javax.imageio.ImageIO$ImageReaderIterator.next(Unknown Source)
    at javax.imageio.ImageIO$ImageReaderIterator.next(Unknown Source)
    at com.lifecare.controller.DicomToJpeg.dicomToJpeg(DicomToJpeg.java:32)

如何解决这个错误,请帮助我...

你已经在JSP页面中导入了以上所有语句吗? 你能把你的JSP页面粘贴过来吗? - Ashwin Parmar
3个回答

2
ImageIO.getImageReadersByFormatName的javadoc说:
返回一个迭代器,其中包含所有当前注册的ImageReader,它们声称能够解码命名格式。
如果您在未检查迭代器是否具有元素的情况下访问迭代器,则会引发异常。
由于它在您的IDE中运行而不是在服务器上运行,因此您可以查看DICOM的图像阅读器是否在服务器上的应用程序类路径中。
但是,我还想知道您如何调用上述类。它是从servlet调用的吗?

1

在调用ImageIO.getImageReadersByFormatName()之前,我通过调用ImageIO.scanForPlugins()解决了这个问题。

ImageIO.scanForPlugins()            
Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader reader = (ImageReader) iter.next();

这在Servlet上完美运行。


0

试试这样做

BufferImage bi = ImageIO.read(dcm file name with path);  

ImageIO.write(enter pathname with filename, format);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接