我正在开发一个hadoop应用程序来处理dicom文件。这些文件分布在hdfs上。
我使用的是一个修改过的recordreader,它读取整个文件并将其内容作为键值对发送。录音机工作正常。
文件的所有文件数据都是字节可写值。我已经检查过了,数据和原始文件完全相同。因此,inputcontent具有与原始文件相同的值。
在将字节可写转换为字节数组之后,我无法将其转换为流并生成一个新的dicom图像(使用imagej api)及其内容。
如何使用此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条答案
按热度按时间1szpjjfi1#
实际上我最终解决了这个问题。
问题是,dicom类的构造函数实际上并不使用inputstream构造图像。只是保存inputstream的一个属性。
为此,需要使用run方法,并为其指定一个文件名。
因此,只需添加以下行:
就在队伍后面
trnvg8h32#
我建议用dicom工具包。
dcm4che2是一个好的、成熟的、开源的、基于java的选项。在您的例子中,可以使用dicominputstream来获取所需的dicom属性。
http://dcm4che.org/
http://sourceforge.net/projects/dcm4che/files/dcm4che2/