DCMTK中的FindAndGetString()返回标签的null
findAndGetString() in DCMTK returns null for the tag
我正在使用DCMTK library
开发快速DICOM viewer
,并且我遵循此链接中提供的示例。
API
的缓冲区始终返回任何标签ID的null,例如:DCM_PatientName
。但是findAndGetOFString() API
工作正常,但仅返回ASCII
中标签的第一个字符,这是该API的工作方式吗?
有人可以让我知道为什么缓冲区是空的?
也是DicomImage API
也同样的问题。
摘要1:
DcmFileFormat fileformat;
OFCondition status = fileformat.loadFile(test_data_file_path.toStdString().c_str());
if (status.good())
{
OFString patientName;
char* name;
if (fileformat.getDataset()->findAndGetOFString(DCM_PatientName, patientName).good())
{
name = new char[patientName.length()];
strcpy(name, patientName.c_str());
}
else
{
qDebug() << "Error: cannot access Patient's Name!";
}
}
else
{
qDebug() << "Error: cannot read DICOM file (" << status.text() << ")";
}
在上面的摘要中,name
具有ASCII值" 50",实际名称为"患者"。
摘要2:
DcmFileFormat file_format;
OFCondition status = file_format.loadFile(test_data_file_path.toStdString().c_str());
std::shared_ptr<DcmDataset> dataset(file_format.getDataset());
qDebug() << "nInformation extracted from DICOM file: n";
const char* buffer = nullptr;
DcmTagKey key = DCM_PatientName;
dataset->findAndGetString(key,buffer);
std::string tag_value = buffer;
qDebug() << "Patient name: " << tag_value.c_str();
在上面的片段中,缓冲区为空。它没有读取名称。
注意:
这只是样本。我只是在API周围玩 目的。
以下示例方法从dcmdataset对象读取患者名称:
std::string getPatientName(DcmDataset& dataset)
{
// Get the tag's value in ofstring
OFString ofstring;
OFCondition condition = dataset.findAndGetOFString(DCM_PatientName, ofstring);
if(condition.good())
{
// Tag found. Put it in a std::string and return it
return std::string(ofstring.c_str());
}
// Tag not found
return ""; // or throw if you need the tag
}
我已经使用您的数据集尝试了您的代码。我只是将输出替换为QT控制台类,为std :: cout。它对我有用 - 即它打印正确的患者名称(例如,scan2.dcm的" detter2")。一切似乎都正确,除了您显然想将数据集的所有权转移到智能指针的事实。
要从dcmfileformat获得DCMDATASET的所有权,您必须调用getandRemovedataset()而不是getDataset()。但是,我认为您的问题无关。您可能想尝试我的修改片段:
DcmFileFormat file_format;
OFCondition status = file_format.loadFile("d:\temp\StackOverflow\scan2.dcm");
std::shared_ptr<DcmDataset> dataset(file_format.getAndRemoveDataset());
std::cout << "nInformation extracted from DICOM file: n";
const char* buffer = nullptr;
DcmTagKey key = DCM_PatientName;
dataset->findAndGetString(key, buffer);
std::string tag_value = buffer;
std::cout << "Patient name: " << tag_value.c_str();
它可能可以帮助您知道您使用的代码和DCMTK方法是正确的,但这并不能解决您的问题。我建议的另一件事是验证File_format.loadfile()返回的结果。也许那里有一个惊喜。
不确定我是否可以为您提供更多帮助,但是我的下一步是验证您的构建环境,例如您用于构建DCMTK的选项。您是否正在使用cmake构建dcmtk?
- 如果我std::dynamic_pointer_cast并且底层dynamic_cast的结果为null,那么返回的sh
- 如何在 c++ 中'NULL'字符串
- c++使用foreach使数组为null
- 当使用通配符和null指针调用函数时,对输出的说明
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 如何在映射中返回null
- C 和 C++ 中开关语句的案例标签的常量值,但显示不同的行为
- 为什么返回 NULL 不会破坏函数?
- 构造函数中的 QQuickItem 父项 null
- 如何正确指定 goto 语句的标签?
- 检查字符串是否"null" C++
- fopen 在 gdb 中返回 NULL
- 使用g++静态初始化带有命名标签的嵌套C++结构
- what(): basic_string::_M_construct null not valid
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 为什么在排序链表上的这种合并实现总是将两个列表都设置为 NULL,而只有一个应该设置一个列表?
- 为什么要从main()返回NULL?
- 为什么 nlohmann/json 序列化 "null" 而不是在 double 上"0"?
- 通过水平滚动条更改标签
- DCMTK中的FindAndGetString()返回标签的null