1

我正在设置一个DICOM阅读器,我将使用它来处理 CT 扫描仪配置。我正在编写应用程序,以便我可以通过转储所有标签轻松查看 DICOM,或者我想指定我想查看的标签。它是一个使用 fo-dicom 库的 C# 控制台应用程序。

我的问题是在我的方法定义中我想传入一个参数,我希望该参数的值来自用户。使用 Console.Read() 通过控制台捕获它。

我能够转储所有标签,但似乎无法弄清楚只是转储一个。

        public static void DumpAllTags(string dicomFile)
        {
            try
            {
                Console.WriteLine($"Attempting to dump all tags from DICOM 
                file:{dicomFile}...");

                var file = DicomFile.Open(dicomFile);
                foreach (var tag in file.Dataset)
                {
                    Console.WriteLine($" {tag} 
                   '{file.Dataset.GetValueOrDefault(tag.Tag, 0, "")}'");
                }
            }
            catch (Exception e)
            {
                Console.WriteLine($"Error occured during DICOM file dump 
                operation -> {e.StackTrace}");
            }
        }

        public static void DumpSingleDicomTag(string dicomFile, string tag)
        {
            try
            {
                Console.WriteLine($"Attempting to dump {tag} from DICOM file: 
                {dicomFile}...");
                var file = DicomFile.Open(dicomFile);
                var dicomDataset = file.Dataset;
                var result = dicomDataset.Get<string>(DicomTag.tag);

                Console.WriteLine(result);


            }
            catch (Exception e)
            {
                Console.WriteLine($"Error occured during DICOM file dump 
                operation -> {e.StackTrace}");
            }
        }

尝试传递键盘捕获的标记变量并将其应用于 DicomTag 方法时,出现错误。

DicomTag 不包含“标签”的定义

4

1 回答 1

0

您的代码无法编译,因为您的变量tag是字符串值而不是 class 的属性DicomTag

一般而言:在 DICOM 中,标签由两个数字定义:组和元素。因此,如果您正在进行某种配置,则不应存储诸如“Patientname”之类的文本,而应存储诸如“0010,0010”之类的数字。

所以这段代码可以工作:

public static void DumpSingleDicomTag(string dicomFile, string tagNumber)
{
    var dataset = DicomFile.Open(dicomFile).Dataset;
    var tag = Dicom.DicomTag.Parse(tagNumber);
    var result = dataset.GetString(tag);
    Console.Writeline(result);
}

// calling it with
DumpSignleDicomTag(dicomFile, "0010,0010");

如果您有充分的理由需要存储标签的名称而不是数字,那么您需要迭代 DicomDictionary,这可能会花费相当长的时间。有一个类DicomDictionary包含所有已定义的 DicomTags 的列表。该列表是按需从资源文件中加载的,因此在第一次访问该类时。然后,您可以迭代整个列表并找到名称匹配的第一个:

using System.Linq;

public static void DumpSingleDicomTag(string dicomFile, string tagName)
{
    var dataset = DicomFile.Open(dicomFile).Dataset;

    var entry = Dicom.DicomDictionary.Default.FirstOrDefault(t => t.Keyword == tagName);
    var result = dataset.GetString(entry.Tag);

    Console.Writeline(result);
}

// calling it with
DumpSignleDicomTag(dicomFile, "PatientName");

但正如我所说,这段代码迭代了整个标签列表,目前大约有 4650 个条目。

https://github.com/fo-dicom/fo-dicom/issues/942

于 2019-10-22T08:22:14.750 回答