【问题标题】:How to recognize DICOM files? C#如何识别 DICOM 文件? C#
【发布时间】:2021-12-01 17:14:33
【问题描述】:

我有一个包含文件的文件夹,但并非所有文件都是 DICOM 文件,我需要识别哪个是 DICOM 文件。

我的第一个决定是在我检查扩展的地方创建 foreach 循环:

foreach (var item in fileList.Where(x => x.Extension == ".dcm"))
        {
        }

但不是所有的都有“.dcm”,有些没有,但它们是 DICOM。

我正在使用 fo-dicom nuget 包,但在那里没有找到答案。

我的问题是: 如何检查 DICOM 的所有文件?

我知道 Dicom 文件有 128 个字节可用,最后 4 个字节用于“DICM”,但我该如何检查呢?

【问题讨论】:

    标签: c# list file foreach dicom


    【解决方案1】:

    我认为我找到了解决问题的方法:

    foreach (FileInfo f in fileList)
    {
        bool isDicom = DicomFile.HasValidHeader(f.FullName);
        if (isDicom)
        {
        }
    }
    

    【讨论】:

      【解决方案2】:

      如果您使用的是 fo-dicom,那么您可以使用内置方法 DicomFile.HasValidHeader(filename),它返回 true 或 false。

      此方法检查那些魔术字节,但也检查旧版本的 dicom,其中 128 个字节不存在。

      【讨论】:

      • @Hans Kesting 谢谢你的回答。是的,我今天找到了这个方法,但是我得到了一个文件列表,而不仅仅是一个文件,而且我正在使用 foreach。或许你知道了,我怎样才能把这个方法放到 foreach 中?
      • @Sanktos 我刚刚修正了一个错字,真正的答案是 gofal3
      • 如果你有foreach(var filename in fileList),那么inside foreach 你可以检查单独的文件。甚至使用 LiNQ:foreach(var dicomfile in fileList.Where(f => DicomFile.HasValidHeader(f)) - 然后您只处理有效文件
      【解决方案3】:

      您可以跳过文件的前 128 个字节并读取接下来的 4 个字节,并将它们与“DICM”的 ASCII 代码进行比较,例如:

      byte[] dicomPrefix    = new byte[4];
      byte[] expectedPrefix = "DICM".Select(c => (byte)c).ToArray();
      
      using (var file = File.OpenRead("your filepath here"))
      {
          if (file.Length >= 132)
          {
              file.Position = 128; // Skip first 128 bytes.
              file.Read(dicomPrefix, 0, dicomPrefix.Length);
      
              if (dicomPrefix.SequenceEqual(expectedPrefix))
              {
                  // It's a DICOM file.
              }
          }
      }
      

      【讨论】:

      • @Matthew Watson 谢谢你的回答。我正在使用 Windows 窗体。我对“使用”有一个错误。此功能在 C# 7.3 中不可用。我可以做什么而不是使用它?抱歉,我是 C# 新手。
      • using(var file = File.OpenRead("your filepath here")){ your code here }
      • @Sanktos 我已经编辑了我的答案以使用旧式using
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多