使用 fo-dicom 保存后 DICOMDir 文件损坏
DICOMDir file getting corrupted after save with fo-dicom
我在向 DICOMDir 添加文件时遇到问题。基于 this example 我已经成功创建并保存了一张来自系列的图像到磁盘。然后,我尝试将该文件添加到 DICOMDIR,以便 Dir 引用新文件,尽管保存成功,但当我再次尝试打开 DICOMDir 及其系列时,出现 "Tag: (0088,0200) not found in dataset" 异常。
代码如下:
var dataset = new DicomDataset();
this.FillDataset(dataset); //this function copies several Tag values of an already existing DICOM Series file, such as Patient information
dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
dataset.Add(DicomTag.Rows, (ushort)rows);
dataset.Add(DicomTag.Columns, (ushort)columns);
var pixelData = DicomPixelData.Create(dataset, true);
pixelData.AddFrame(buffer);
var dicomfile = new DicomFile(dataset);
var pathImage = Path.Combine(dirImages.FullName, imageFileName);
dicomfile.Save(pathImage); //Image is saved fine and it's well formed, I've checked opening it with an online DICOM viewer
var dicomdirPath = Path.Combine(studyPath, Constants.DICOMDIRFileName);
var dicomdir = DicomDirectory.Open(dicomdirPath);
dicomdir.AddFile(dicomfile, $@"Images\{imageFileName}");
dicomdir.Save(dicomdirPath); //this executes without problems and the DICOMDIR is saved
这是系列的打开方式:
var dicomDirectory = await DicomDirectory.OpenAsync(dicomdirPath);
foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
{
foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
{
foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
{
foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
{
var dicomDataset = imageRecord.GetSequence(DicomTag.IconImageSequence).Items.First(); //This line works fine before saving the image in the method above, but throws when opening the same study
//Load data and series from dataset
}
}
}
}
我不知道我是否遗漏了有关保存 DICOMDir 文件的内容,或者这是一个错误。
您尝试访问显然不存在的 IconImageSequence (0088,0200)。 DicomDir 只包含图像的一些主要数据。将图像添加到 dicomdir 时,您可以添加其他信息。
fo-dicom 不会自动添加的可选信息之一是图标。 DicomDir 允许包含一个小图标来显示是否要快速显示一些预览。
实际上 imageRecord
应该包含您可能需要的所有信息,例如 instanceuid 或文件名等。
我不知道为什么在用 fo-dicom 存储文件之前这行代码运行良好。我假设已经有一个 DICOMDIR 使用包含图标的其他应用程序创建?然后当您到达新添加的条目时 foreach 崩溃。
您可以在将新实例添加到 DICOMDIR 时自己添加一个图标,或者您可以添加一个类似 "if imageRecord.TryGetSequece(iconImageSequence, out seq).." 的检查来处理没有图标的情况。
我建议无论如何都要添加检查,因为有一天您可能会阅读引用某些结构化报告的 DICOMDIR,而这些结构化报告没有像素数据,因此不会包含图标。
我在向 DICOMDir 添加文件时遇到问题。基于 this example 我已经成功创建并保存了一张来自系列的图像到磁盘。然后,我尝试将该文件添加到 DICOMDIR,以便 Dir 引用新文件,尽管保存成功,但当我再次尝试打开 DICOMDir 及其系列时,出现 "Tag: (0088,0200) not found in dataset" 异常。
代码如下:
var dataset = new DicomDataset();
this.FillDataset(dataset); //this function copies several Tag values of an already existing DICOM Series file, such as Patient information
dataset.Add(DicomTag.PhotometricInterpretation, PhotometricInterpretation.Rgb.Value);
dataset.Add(DicomTag.Rows, (ushort)rows);
dataset.Add(DicomTag.Columns, (ushort)columns);
var pixelData = DicomPixelData.Create(dataset, true);
pixelData.AddFrame(buffer);
var dicomfile = new DicomFile(dataset);
var pathImage = Path.Combine(dirImages.FullName, imageFileName);
dicomfile.Save(pathImage); //Image is saved fine and it's well formed, I've checked opening it with an online DICOM viewer
var dicomdirPath = Path.Combine(studyPath, Constants.DICOMDIRFileName);
var dicomdir = DicomDirectory.Open(dicomdirPath);
dicomdir.AddFile(dicomfile, $@"Images\{imageFileName}");
dicomdir.Save(dicomdirPath); //this executes without problems and the DICOMDIR is saved
这是系列的打开方式:
var dicomDirectory = await DicomDirectory.OpenAsync(dicomdirPath);
foreach (var patientRecord in dicomDirectory.RootDirectoryRecordCollection)
{
foreach (var studyRecord in patientRecord.LowerLevelDirectoryRecordCollection)
{
foreach (var seriesRecord in studyRecord.LowerLevelDirectoryRecordCollection)
{
foreach (var imageRecord in seriesRecord.LowerLevelDirectoryRecordCollection)
{
var dicomDataset = imageRecord.GetSequence(DicomTag.IconImageSequence).Items.First(); //This line works fine before saving the image in the method above, but throws when opening the same study
//Load data and series from dataset
}
}
}
}
我不知道我是否遗漏了有关保存 DICOMDir 文件的内容,或者这是一个错误。
您尝试访问显然不存在的 IconImageSequence (0088,0200)。 DicomDir 只包含图像的一些主要数据。将图像添加到 dicomdir 时,您可以添加其他信息。 fo-dicom 不会自动添加的可选信息之一是图标。 DicomDir 允许包含一个小图标来显示是否要快速显示一些预览。
实际上 imageRecord
应该包含您可能需要的所有信息,例如 instanceuid 或文件名等。
我不知道为什么在用 fo-dicom 存储文件之前这行代码运行良好。我假设已经有一个 DICOMDIR 使用包含图标的其他应用程序创建?然后当您到达新添加的条目时 foreach 崩溃。
您可以在将新实例添加到 DICOMDIR 时自己添加一个图标,或者您可以添加一个类似 "if imageRecord.TryGetSequece(iconImageSequence, out seq).." 的检查来处理没有图标的情况。
我建议无论如何都要添加检查,因为有一天您可能会阅读引用某些结构化报告的 DICOMDIR,而这些结构化报告没有像素数据,因此不会包含图标。