[英]Error from reading with ClearCanvas in DICOM file in C# and how to display the DICOM VCR tag
[英]How to dump a single dicom tag specified my user input
我正在设置一个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不包含“标签”的定义
您的代码无法编译,因为您的变量tag
是一个字符串值,而不是DicomTag
类的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
类,其中包含所有已定义的DicomTag的列表。 该列表是从资源文件中按需加载的,因此在首次访问该类时。 然后,您可以遍历整个列表,并找到名称匹配的第一个列表:
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个条目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.