Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中读取DICOM文件的内容?_Java_Dicom_Dcm4che - Fatal编程技术网

如何在Java中读取DICOM文件的内容?

如何在Java中读取DICOM文件的内容?,java,dicom,dcm4che,Java,Dicom,Dcm4che,DICOM文件包含一系列CAT扫描图像。是否有一个用Java实现的DICOM库可以读取文件并提取其中存储的图像?我想将这些图像存储到BuffereImage数据类型中。在Java中: 在JAVA中阅读DICOM最好的文章之一是以下链接 还有一件事你需要额外的软件来提取图像没有这个软件你无法阅读图像和内容 jai-1_1_2_01-lib-windows-i586-jdk.exe jai_imageio-1_0_01-lib-windows-i586-jre.exe 因为DICOM图像的分辨率非

DICOM文件包含一系列CAT扫描图像。是否有一个用Java实现的DICOM库可以读取文件并提取其中存储的图像?我想将这些图像存储到BuffereImage数据类型中。

在Java中:

在JAVA中阅读DICOM最好的文章之一是以下链接

还有一件事你需要额外的软件来提取图像没有这个软件你无法阅读图像和内容

jai-1_1_2_01-lib-windows-i586-jdk.exe

jai_imageio-1_0_01-lib-windows-i586-jre.exe

因为DICOM图像的分辨率非常高

您还需要JDK32位


在Web项目中:配置JDK路径安装的Jre路径。

您可以使用dcm4che-3.3.X。这是一个全新的框架重写版本,完全集成了jai imageio库,您无需再下载和配置它

读取Dicom文件的元信息需要从Dicom文件创建
org.dcm4che3.io.DicomInputStream
,并使用实现
org.dcm4che3.io.dicominputshandler
接口的类解析流。您必须实现以下方法:

void readValue(DicomInputStream dis, Attributes attrs) throws IOException;
void readValue(DicomInputStream dis, Sequence seq) throws IOException;
void readValue(DicomInputStream dis, Fragments frags) throws IOException;
void startDataset(DicomInputStream dis) throws IOException;
void endDataset(DicomInputStream dis) throws IOException;
startDataset
endDataset
方法在流打开/关闭时启动。当找到属性、序列或片段时,将调用read方法。您可以在中看到完整的示例实现

要将dicom图像读入
java.awt.image.buffereImage
中,您需要以这种方式从dicom文件中获取
javax.imageio.stream.ImageInputStream
,其中
dicomFile
java.io.file

如果您想知道这个简单的代码是如何工作的,这是因为
dcm4che imageio
插件

您可以再次在中看到完整的示例实现

显然,您需要一个正确配置的maven
pom.xml
,其中包含所需的所有依赖项,至少:

<dependencies>
  <dependency>
    <groupId>org.dcm4che</groupId>
    <artifactId>dcm4che-imageio</artifactId>
    <version>3.3.7</version>
  </dependency>
  <dependency>
    <groupId>org.dcm4che</groupId>
    <artifactId>dcm4che-imageio-rle</artifactId>
    <version>3.3.7</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>com.sun.media</groupId>
    <artifactId>jai_imageio</artifactId>
    <version>1.2-pre-dr-b04</version>
    <scope>runtime</scope>
  </dependency>
  <dependency>
    <groupId>org.dcm4che.tool</groupId>
    <artifactId>dcm4che-tool-common</artifactId>
    <version>3.3.7</version>
    <scope>compile</scope>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
  </dependency>
</dependencies>

org.dcm4che
dcm4che图像
3.3.7
org.dcm4che
dcm4che图像
3.3.7
运行时
com.sun.media
jai_imageio
1.2-pre-dr-b04
运行时
org.dcm4che.tool
dcm4che通用工具
3.3.7
编译
org.slf4j
slf4j-log4j12
以及dcm4che maven回购协议

<repositories>
  <repository>
    <id>www.dcm4che.org</id>
    <name>dcm4che Repository</name>
    <url>http://www.dcm4che.org/maven2</url>
</repository>

www.dcm4che.org
dcm4che存储库
http://www.dcm4che.org/maven2

希望有帮助。

我不久前写了一些代码,让我读取“.dcm”文件并将它们导出到BuffereImage数据类型数组中

我使用了您可以在此处找到的库dcm4che:

在我编写的代码中,我使用了这些类:

import org.dcm4che3.imageio.plugins.dcm.*;
import org.dcm4che3.data.Tag;
import org.dcm4che3.io.DicomOutputStream;
首先,我使用一种方法读取DICOM文件,并将其像素数据放入光栅:

static BufferedImage createBufferedImgdFromDICOMfile(File dicomFile) {
   Raster raster = null ;
   System.out.println("Input: " + dicomFile.getName());

   //Open the DICOM file and get its pixel data
   try {
       Iterator iter = ImageIO.getImageReadersByFormatName("DICOM");
       ImageReader reader = (ImageReader) iter.next();
       DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam();
       ImageInputStream iis = ImageIO.createImageInputStream(dicomFile);
       reader.setInput(iis, false);
       //Returns a new Raster (rectangular array of pixels) containing the raw pixel data from the image stream
       raster = reader.readRaster(0, param);
       if (raster == null)
              System.out.println("Error: couldn't read Dicom image!");
       iis.close();
   }
    catch(Exception e) {
        System.out.println("Error: couldn't read dicom image! "+ e.getMessage());
        e.printStackTrace();
    }
   return get16bitBuffImage(raster);
}
然后,我使用此方法从先前从DICOM文件创建的光栅中获取像素,并将其放入具有黑白颜色模型的缓冲图像中:

public static BufferedImage get16bitBuffImage(Raster raster) {
    short[] pixels = ((DataBufferUShort) raster.getDataBuffer()).getData();
    ColorModel colorModel = new ComponentColorModel(
        ColorSpace.getInstance(ColorSpace.CS_GRAY),
        new int[]{16},
        false,
        false,
        Transparency.OPAQUE,
        DataBuffer.TYPE_USHORT);
     DataBufferUShort db = new DataBufferUShort(pixels, pixels.length);
     WritableRaster outRaster = Raster.createInterleavedRaster(
        db,
        raster.getWidth(),
        raster.getHeight(),
        raster.getWidth(),
        1,
        new int[1],
        null);
     return new BufferedImage(colorModel, outRaster, false, null);
}
如果要将BufferImage导出为JPEG文件,可以使用以下方法:

private static void outputJpegImage(BufferedImage outputImage, String outputPath) {
   try {
   File outputJpegFile = new File(outputPath);
   OutputStream output = new BufferedOutputStream(new FileOutputStream(outputJpegFile));
   JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(output);
   encoder.encode(outputImage);
   output.close();
    } catch (IOException e) {
        System.out.println("Error: couldn't write jpeg image! "+ e.getMessage());
        e.printStackTrace();
    }
   System.out.println("Output: " + outputPath);
}

也许能帮你前进。一系列不同的工具包也可供选择。你们有并没有实践过如何阅读dicom文件,我曾经使用过diocm文件,然后我写了这个答案。