【问题标题】:Can not find Open method in Evil Dicom using latest version from github使用来自 github 的最新版本在 Evil Dicom 中找不到 Open 方法
【发布时间】:2015-01-14 23:14:47
【问题描述】:

我正在尝试按照这里的教程进行操作:

http://www.rexcardan.com/2014/10/evil-dicom-basics/

并处理我的 DICOM 文件以显示图像。在本教程中,调用 DICOMObject.Open() 方法来处理文件路径。我的问题是智能感知不会为我解决这个问题。有人可以帮忙吗?

我下载了这个版本:

https://github.com/rexcardan/Evil-DICOM

编辑

使用以下内容:

var dcm = DICOMObject.Read(@"C:\file\path\filename.dcm");

在单步执行DICOMObject 的代码时,到目前为止一切似乎都运行良好:

public static IDICOMElement ReadElementImplicitLittleEndian(DICOMBinaryReader dr)
{
    var tag = TagReader.ReadLittleEndian(dr);
    var vr = TagDictionary.GetVRFromTag(tag);
    int length = LengthReader.ReadLittleEndian(VR.Null, dr);
    var data = DataReader.ReadLittleEndian(length, dr, TransferSyntax.IMPLICIT_VR_LITTLE_ENDIAN);
    var el = ElementFactory.GenerateElement(tag, vr, data, TransferSyntax.IMPLICIT_VR_LITTLE_ENDIAN);
    return el;
}

当代码到达时:

int length = LengthReader.ReadLittleEndian(VR.Null, dr);

length 返回 int1919252000 bytes,即 ~2GB。然后代码步骤:

var data = DataReader.ReadLittleEndian(length, dr, TransferSyntax.IMPLICIT_VR_LITTLE_ENDIAN);

它检查是否有任何字节要读取(有)并转到此处读取的字节:

public byte[] ReadBytes(int count)
{
    byte[] buffer = new byte[count];
    _binaryReader.Read(buffer, 0, count);
    return buffer;
}

byte[] buffer = new byte[count]; 是代码中实际发生异常的地方。我已经测试了它可以处理的字节数,它似乎在.6 - .7 GB 左右,这甚至不是我需要的一半。是否可以扩展缓冲区以接受我需要的所有内容?

【问题讨论】:

  • OutOfMemoryException 出现在非常大的 DICOM 文件中,超过 0.6 GB,你的意思是?阅读更适合较小的文件?
  • @AndersGustafsson - 这是正确的。如果我缩短长度参数以在 byte[] 中返回少于 0.6 GB 的字节,它似乎会继续并创建文件的其余部分。
  • 听起来需要对代码进行一些改进。我建议您在 Evil DICOM Github 网站上发布问题。
  • @AndersGustafsson - 好吧,不熟悉 Github。我在哪里发布问题?
  • @AndersGustafsson - 感谢您的帮助。我打开了一个问题。我会将您的回答标记为正确,因为您在技术上确实解决了我原来的问题。感谢您提供的所有信息和帮助!

标签: dicom evil-dicom


【解决方案1】:

我没有看过视频,但据我所知你应该使用:

var dicomObj = DICOMObject.Read(filePath);

使用 Evil DICOM 读取 DICOM 文件。

请查看源代码here。我不确定,但最近的 API 更改可能解释了这种混淆。

【讨论】:

  • 昨晚做了更多的研究后,我得出了同样的结论。但是,使用您的代码时,我似乎遇到了一个恼人的错误:Exception of type 'System.OutOfMemoryException' was thrown.。你有没有使用DICOMObject.Read() 遇到过这种情况?
  • @scapegoat17 我假设您在 Rex 的库中遇到了这个错误,对吧? (我管理 Evil DICOM 的 Portable Class Library fork,这就是我要问的原因。)我建议你在 Rex 的 Github 站点上发布一个问题,并包括更详细的异常堆栈跟踪,如果可能的话,包括导致失败。
  • 你是对的。它在雷克斯的图书馆里。我想让你看到我在上面的编辑,如果你没有看到任何让你跳出来的东西,我会将我发现的内容发布到 Github 网站上。
【解决方案2】:

抱歉回复晚了。

我的第一个想法是该文件实际上并未使用 Implicit VR Little Endian 进行编码。这是在 DICOM 前导码和元数据丢失时假定的默认传输语法。通常,在元数据(以 0002 开头的标签)中,会显示传输语法。在实际文件中(在 Windows 资源管理器中,而不是来自 ED),大小真的是 600+MB 吗?如果是这样,那是什么类型的文件,所以我可以玩一个?

我向 DICOMObject 类添加了一个新方法,让您可以在读取失败时尝试另一种语法:

    /// <summary>
    ///     Reads a DICOM file from a path
    /// </summary>
    /// <param name="filePath">the path to the file</param>
    /// <param name="trySyntax">the transfer syntax to use in case there is no metadata explicitly included</param>
    /// <returns></returns>
    public static DICOMObject Read(string filePath,
        TransferSyntax trySyntax = TransferSyntax.IMPLICIT_VR_LITTLE_ENDIAN)
    {
        return DICOMFileReader.Read(filePath, trySyntax);
    }

在我的经验中,我遇到了一些格式错误的 DICOM,这些错误导致我出现了像您提到的那样的错误。当然,确实可能是您的内存不足,如果您确定传输语法正确,我想进一步深入研究。试试“Explicit VR Little Endian”,看看能不能解决你的问题。

【讨论】:

    【解决方案3】:

    试试这个

    var bdcm= File.ReadAllBytes(@"AbsolutePath");
    var dcm = DICOMObject.Read(bdcm);
    

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      相关资源
      最近更新 更多