0

我正在尝试按照此处的教程进行操作:

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返回一个int约为1919252000 bytes2GB 的值。然后代码步骤:

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还不到我需要的一半。是否可以扩展缓冲区以接受我需要的所有内容?

4

3 回答 3

1

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

var dicomObj = DICOMObject.Read(filePath);

使用Evil DICOM读取 DICOM 文件。

请在此处查看源代码。我不确定,但最近可能有一个 API 更改解释了这种混乱。

于 2015-01-15T07:02:41.420 回答
0

回复晚了非常抱歉。

我的第一个想法是该文件实际上并未以 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,这些 DICOM 导致了像你提到的那样的错误。当然,确实可能是您的内存不足,如果您确定传输语法正确,我想进一步深入研究。试试“Explicit VR Little Endian”,看看能不能解决你的问题。

于 2015-02-10T14:20:57.243 回答
0

试试这个

var bdcm= File.ReadAllBytes(@"AbsolutePath");
var dcm = DICOMObject.Read(bdcm);
于 2015-09-27T08:10:07.180 回答