【发布时间】:2020-07-30 13:59:54
【问题描述】:
我们的 C++ 软件使用 ITK 来编写 DICOM 文件。在其中,我们有一个私有标签,其中LO(长字符串)为VR,2 个十进制值作为0.3234\0.34223 之类的值。
LO 选项是 ITK 固有的。
在其他 java 应用程序中,我使用 dcm4che3 来读取/写入它们。由于它尊重 DICOM 协议,因此禁止使用反斜杠,dcm4che 将值解释为"0.3234",并且永远不会达到第二个值。
我使用的所有 DICOM 查看器应用程序都可以显示此值。
所以我的问题是:尽管存在反斜杠,但在 dcm4che 中是否有将这个完整值读取为字符串 "0.3234\0.34223" 的技巧?
下面是我使用的代码:
public DicomInfo uploadFile(MultipartFile file) throws IOException, ParseException {
DicomInfo infos = new DicomInfo();
Attributes attrs = readDicomAttributes(file);
infos.setTags(toAttributesObject(attrs).toString());
}
private static JsonObject toAttributesObject(Attributes targetSeriesAttrs)
{
StringWriter strWriter = new StringWriter();
JsonGenerator gen = Json.createGenerator(strWriter);
JSONWriter writer = new JSONWriter(gen);
writer.write(targetSeriesAttrs);
gen.flush();
gen.close();
return Json.createReader(new
StringReader(strWriter.toString())).readObject();
}
public Attributes readDicomAttributes(MultipartFile file) throws IOException
{
DicomInputStream dis = new DicomInputStream(file.getInputStream());
Attributes dataSet = dis.readDataset(-1, Tag.PixelData);
Attributes fmi = dis.readFileMetaInformation();
dis.close();
fmi.addAll(dataSet);
return fmi;
}
在我为这个标签得到的 JSON 中:
\"00110013\":{\"vr\":\"LO\",\"Value\":[\"0.4323\"]},
如您所见,它是 LO,第二部分已经丢失。
我获取具体属性的方法:
attr.getStrings(0x00110013)
发回一个只有一个值的表格,0.4323。
问题发生在 readDataSet 函数期间。
当我用免费的dicom viewer之类的软件打开标签时,我有完整的数据,所以数据就在这里。
好的,我找到了问题的根源......它是addAllfmi.addAll(dataSet);
在数据集中,getStrings 完美运行。在fmiaddAll之后,属性丢失了第二个值。
所以我的问题是现在解决这个addAll 问题:dcm4che3 java lib: Attributes.addAll method seems to lost multiple LO values
【问题讨论】:
-
反斜杠不是被禁止的,我猜你必须以某种方式告诉 dcm4che 你的私有属性的值多重性为 2。我不知道该怎么做,但通常会提到这个配置作为“私人词典”
-
in LO 反斜杠不应使用,请参阅文档,因此即使 getStringS 也不起作用。而且我无法修改 VR。
-
我认为唯一的解决方案是忘记 dcm4che 并在 java 中使用 ITK impl ...
-
我没有使用过 dcm4che,但快速浏览一下资料表明
StringValueType.getStrings()做了正确的事情,例如通过 '\' 分隔符拆分标签内容并返回字符串。你能展示你用来读取标签内容的代码吗? -
我只是编辑以放置我的代码和结果