网上有很多方法对dicom的文件信息进行遍历,目前找到一个总结的比较好的,记录在此。
原文链接:(27条消息) 【DCMTK】遍历标签tags_dcmtk 读取tag_Beyond欣的博客-CSDN博客
方法一
dcmtk自带方法
dfile.getMetaInfo()->print(std::cout,DCMTypes::PF_useANSIEscapeCodes);
dfile.getDataset()->print(std::cout,DCMTypes::PF_useANSIEscapeCodes);
方法二
对SEQ类型递归遍历
#include "dcmtk/dcmdata/dctk.h"
#define Print std::cout<<
#define Printend <<std::endl;
#define PrintemspValue(emsp,value1,value2,value3,value4,value5,value6) \
for(int i = 0; i < emsp; i++) {Print "\40\40";}\
Print value1 <<" " <<value2<<" ["<< value3 <<"] "\
<< value4 <<" " <<value5 <<" (" <<value6<<")" Printend
template<typename T>
class NewDcmItem: public T {
public:
NewDcmItem(const T &old): T(old) {
}
DcmList *GetDcmList()const {
return this->elementList;
}
protected:
virtual ~NewDcmItem() {}
};
using MyDcmDataset = NewDcmItem<DcmDataset>;
using MyDcmMetaInfo = NewDcmItem<DcmMetaInfo>;
using MywDcmItem = NewDcmItem<DcmItem>;
template<typename T>
void PaintTags(T &t, const int &emsp = 0) {
DcmList *elementList = t.GetDcmList();
if (!elementList->empty()) {
DcmObject *dO;
DcmTag tag;
OFString value;
elementList->seek(ELP_first);
do {
dO = elementList->get();
tag = dO->getTag();
DcmElement *elem;
t.findAndGetElement(tag, elem);
elem->getOFString(value, 0);
PrintemspValue(emsp, tag, tag.getVRName(),
value, dO->getLength(), dO->getVM(), tag.getTagName())
if(EVR_SQ == dO->getVR()) {
DcmItem *sq;
t.findAndGetSequenceItem(dO->getTag(), sq);
MywDcmItem *dcmitem_info = new MywDcmItem(*sq);
PaintTags(*dcmitem_info, emsp + 1);
}
} while (elementList->seek(ELP_next));
delete dO;
}
}
int main() {
DcmFileFormat dfile;
dfile.loadFile("/home/arteryflow/图片/DicomData/DSA/Liyunlong/IMG-0002-00001.dcm");
Print "DcmMetaInfo------" Printend
MyDcmMetaInfo *meta_info = new MyDcmMetaInfo(*dfile.getMetaInfo());
PaintTags(*meta_info);
Print "DcmDataset------" Printend
MyDcmDataset *dataset_info = new MyDcmDataset(*dfile.getDataset());
PaintTags(*dataset_info);
}