DCMTK中的FindAndGetString()返回标签的null

findAndGetString() in DCMTK returns null for the tag

本文关键字:标签 null 返回 中的 FindAndGetString DCMTK      更新时间:2023-10-16

我正在使用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?