将gdcm DataElement值检索为字符串

时间:2012-08-23 13:43:13

标签: gdcm

我基本上是尝试使用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 帕沃

4 个答案:

答案 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))