我基本上是尝试使用gdcm C ++库从DICOM文件中读出所有或大多数属性值。我很难找到任何非字符串值。 gdcm示例通常假设我事先知道组/元素编号,因此我可以使用属性模板类,但我不需要或对它们感兴趣,我只需要报告所有属性名称和值。实际上值应该进入XML,所以我需要一个字符串表示。我现在拥有的是:
for (gdcm::DataSet::ConstIterator it = ds.Begin(); it!=ds.End(); ++it) {
const gdcm::DataElement& elem = *it;
if (elem.GetVR() != gdcm::VR::SQ) {
const gdcm::Tag& tag = elem.GetTag();
std::cout << dict.GetDictEntry(tag).GetKeyword() << ": ";
std::cout << elem.GetValue() << "\n";
}
}
对于像UL这样的数值,输出类似于“Loaded:4”,可能意味着库已经加载了4个字节的数据(无符号长整数)。这根本没有帮助,如何获得实际价值?我当然必须忽略一些显而易见的事情。
从示例中可以看出有一个gdcm :: StringFilter类能够做到这一点,但似乎它想在DICOM文件中自己搜索每个元素,这会使算法复杂度呈二次方式,这肯定是我想避免的事情。
TIA 帕沃
答案 0 :(得分:1)
你看过gdcmdump了吗?您可以使用它将DICOM文件输出为文本或XML。您还可以查看源代码以了解它是如何做到的。
答案 1 :(得分:1)
我最终将gdcm :: StringFilter :: ToStringPair()的部分提取到一个单独的函数中。似乎至少适用于更简单的DCM文件...
答案 2 :(得分:0)
尝试这样的事情:
gdcm :: Reader reader;
reader.SetFileName(absSlicePath.c_str());
if( !_reader.Read() ) { return; } gdcm::File file = reader.GetFile(); gdcm::DataSet ds = file.GetDataSet(); std::stringstream strm; strm << ds;
你得到一个包含所有DICOM标签值的字符串流。 实际上,大多数DICOM类(DataElement,DataSet等)都有std :: ostream&amp;运营商LT;&LT; (std :: ostream&amp; _os,const * Some_Class *&amp; _val)重载。所以你可以扩展for循环并使用operator&lt;&lt;将值放入stringstream,然后放入字符串。
例如,如果您使用的是QT:
UI-&GT; pTagsTxt-&GT;附加(QString的(strm.str()c_str())。);
答案 3 :(得分:0)
您也可以先阅读常见问题解答,特别是How do I convert an attribute value to a string ?
如上所述,您只需使用gdcm :: StringFilter:
sf = gdcm.StringFilter()
sf.SetFile(r.GetFile())
print sf.ToStringPair(gdcm.Tag(0x0028,0x0010))