我正在开发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)
{
}
}
}
答案 0 :(得分:2)
实际上我最终解决了这个问题。
问题是,DICOM类的构造函数实际上并不构造带有inputStream的图像。只是保存inputStream有一个属性。
为此,您需要使用run方法,为其提供文件名。
因此,只需要添加以下行:
image.run("DICOM Test");
在行
之后image = new DICOM(is);
答案 1 :(得分:0)
我建议使用DICOM工具包。
DCM4CHE2是一个优秀,成熟,开源,基于Java的选项。在您的情况下,您将使用DicomInputStream来获取所需的DICOM属性。