C# 使用fo dicom保存后DICOMDir文件损坏

C# 使用fo dicom保存后DICOMDir文件损坏,c#,dicom,fo-dicom,C#,Dicom,Fo Dicom,我在向DICOMDir添加文件时遇到问题。基于此,我已成功创建了一个系列的图像并将其保存到磁盘。然后,我尝试将该文件添加到DICOMDIR,以便Dir引用新文件,并且,尽管保存成功,但当我再次尝试打开DICOMDIR及其系列时,我得到一个“Tag:(00880200)not found in dataset”异常 代码如下: var dataset = new DicomDataset(); this.FillDataset(dataset); //this function copies se

我在向DICOMDir添加文件时遇到问题。基于此,我已成功创建了一个系列的图像并将其保存到磁盘。然后,我尝试将该文件添加到DICOMDIR,以便Dir引用新文件,并且,尽管保存成功,但当我再次尝试打开DICOMDIR及其系列时,我得到一个“Tag:(00880200)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(00880200)。DicomDir只包含图像的一些主要数据。将图像添加到dicomdir时,由您添加其他信息。 fodicom不会自动添加的可选信息之一是图标。如果您想快速显示一些预览,DicomDir允许包含一个小图标来显示

实际上,
imageRecord
应该包含您可能需要的所有信息,如instanceuid或filename等

我不知道为什么在用fo dicom存储文件之前,这行代码工作得很好。我想已经有一个DICOMDIR与其他一些应用程序,包括图标创建?然后,当您到达新添加的条目时,foreach崩溃

您可以在将新实例添加到DICOMDIR时自己添加图标,也可以添加类似“if imageRecord.tryGetSequence(iconImageSequence,out seq)…”的检查来处理没有图标的情况


无论如何,我建议添加检查,因为您可能会在某一天读到一个DICOMDIR,其中引用了一些结构化报告,而这些结构化报告没有像素数据,因此不会包含图标。

对,我忘了说在第二种方法中读取的与我在第一种方法中打开以向其添加图像的相同。@pona这个解释实际上解决了您的问题吗?在我可以帮助您的地方还缺少什么吗?我想是的,但我仍然无法返回到代码来实际验证它。我一定会尽快把它标记为答案。最后,这就是解决方案。DICOMDIR被正确保存,我的“序列打开方法”假设每个“imageRecord”实际上都是一个带有IconImageSequence的序列,而第一个方法中保存的图像不是这样。感谢@gofal3的帮助和耐心。