使用ImageJ API从字节数组转换为DICOM

时间:2014-07-07 22:45:14

标签: java hadoop dicom imagej

我正在开发Hadoop应用程序以处理DICOM文件。 这些文件分发在HDFS上。

我正在使用修改后的RecordReader,它读取整个文件并将其内容作为键值对发出。记录阅读器正常工作。

文件的所有文件数据都在ByteWritable值中。 我已经检查过,数据完全等于原始文件。 因此,inputContent具有与原始文件相同的值。

将ByteWritable转换为字节数组后,我无法将其转换为流并使用imageJ api生成新的DICOM图像及其内容。

如何使用此API进行此操作?

遵循代码示例:

public void inputTester()
    {
        DICOM image;
        Configuration testConf = new Configuration(false);

        /* Reads the local file system */
        testConf.set("fs.default.name", "file:///");

        File testFile = new File("path/to/dicom/file");

        Path path = new Path(testFile.getAbsoluteFile().toURI());
        FileSplit split = new FileSplit(path, 0, testFile.length(), null);

        InputFormat inputFormat = ReflectionUtils.newInstance(WholeFileInputFormat.class, testConf);
        TaskAttemptContext context = new TaskAttemptContextImpl(testConf, new TaskAttemptID());

        try
        {
            RecordReader reader = inputFormat.createRecordReader(split, context);
            while (reader.nextKeyValue())
            {
                /* get the bytes array */
                BytesWritable inputBytesWritable = (BytesWritable) reader.getCurrentValue();
                byte[] inputContent = inputBytesWritable.getBytes();

                InputStream is = new ByteArrayInputStream(inputContent);
                image = new DICOM(is);
            }
        }
        catch (Exception e)
        {

        }

    }
}

2 个答案:

答案 0 :(得分:2)

实际上我最终解决了这个问题。

问题是,DICOM类的构造函数实际上并不构造带有inputStream的图像。只是保存inputStream有一个属性。

为此,您需要使用run方法,为其提供文件名。

因此,只需要添加以下行:

image.run("DICOM Test");

在行

之后
image = new DICOM(is);

答案 1 :(得分:0)

我建议使用DICOM工具包。

DCM4CHE2是一个优秀,成熟,开源,基于Java的选项。在您的情况下,您将使用DicomInputStream来获取所需的DICOM属性。