我正在尝试按照这里的教程:
http://www.rexcardan.com/2014/10/evil-dicom-basics/
并处理我的DICOM文件以显示图像。在本教程中,将调用DICOMObject.Open()方法来处理文件路径。我的问题是intellisense不会为我挑选这个。有人能帮忙吗?
我下载了这个版本:
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 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
左右,这甚至不是我需要的一半。是否可以扩展缓冲区以接受我需要的所有内容?
答案 0 :(得分:1)
我没看过视频,但据我所知你应该使用:
var dicomObj = DICOMObject.Read(filePath);
使用 Evil DICOM 读取DICOM文件。
请参阅源代码here。我不确定,但可能最近的API更改解释了这种混乱。
答案 1 :(得分: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,这些错误导致了我提到的错误。当然,它可能真的是你的内存不足,如果你确定传输语法是正确的,我想进一步深入研究。尝试“Explicit VR Little Endian”,看看是否能解决您的问题。
答案 2 :(得分:0)
试试这个
var bdcm= File.ReadAllBytes(@"AbsolutePath");
var dcm = DICOMObject.Read(bdcm);