DicomReader
DICOM简述
https://www.jianshu.com/p/758fa8c22474
读取文件
void DicomReader::readFile(const std::string& t_filePath)
{
m_filePath = t_filePath;
// 通过DcmFileFormat读取文件,bad检测是否存在数据集
m_file = std::make_unique<DcmFileFormat>();
if (m_file->loadFile(t_filePath.c_str()).bad())
{
m_file.release();
m_dataSet = nullptr;
throw std::runtime_error("Cannot open file!");
}
// ok则获取DcmDataset
m_dataSet = m_file->getDataset();
}
获取Patient,Study等类
m_dataSet->findAndGetOFStringArray(tagKey, result);
// 获取Patient(其他model类原理相同)
std::unique_ptr<Patient> DicomReader::getReadPatient() const
{
auto tempPatient = std::make_unique<Patient>();
// getTagFromDataSet函数获取tag信息
const auto age = getTagFromDataSet(DCM_PatientAge);
tempPatient->setAge(age.empty() ? 0 : std::stoi(age));
tempPatient->setBirthDate(getTagFromDataSet(DCM_PatientBirthDate));
tempPatient->setID(getTagFromDataSet(DCM_PatientID));
tempPatient->setName(getTagFromDataSet(DCM_PatientName));
return tempPatient;
}
// 这里获取tag信息
std::string DicomReader::getTagFromDataSet(const DcmTagKey& tagKey) const
{
try
{
OFString result;
// 这个是获取tag的函数:findAndGetOFStringArray
m_dataSet->findAndGetOFStringArray(tagKey, result);
return result.c_str();
}
catch (std::exception& ex)
{
//todo log exception
[[maybe_unused]] const auto* const what = ex.what();
return {};
}
}