Не удается найти метод Open в Evil Dicom, используя последнюю версию из gethub
Я пытаюсь следовать этому уроку:
http://www.rexcardan.com/2014/10/evil-dicom-basics/
и обработать мой файл DICOM, чтобы показать изображение. В этом учебном пособии метод DICOMObject.Open() вызывается для обработки пути к файлу. Моя проблема в том, что intelisense не подхватил это для меня. Кто-нибудь сможет помочь с этим?
Я скачал эту версию:
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
что составляет ~2 ГБ. Затем код выполняет следующие действия:
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
что даже не половина того, что мне нужно. Есть ли возможность расширить буфер, чтобы принять все, что мне нужно?
3 ответа
Я не смотрел видео, но насколько я знаю, вы должны использовать:
var dicomObj = DICOMObject.Read(filePath);
читать файл DICOM, используя Evil DICOM.
Пожалуйста, посмотрите исходный код здесь. Я не уверен, но, возможно, недавно произошло изменение API, которое объясняет эту путаницу.
Попробуй это
var bdcm= File.ReadAllBytes(@"AbsolutePath");
var dcm = DICOMObject.Read(bdcm);
Извините за поздний ответ.
Сначала я подумал, что файл на самом деле не закодирован в Implicit VR Little Endian. Это синтаксис передачи по умолчанию, который предполагается, если преамбула DICOM и метаданные отсутствуют. Обычно в метаданных (теги, начинающиеся с 0002) раскрывается синтаксис передачи. На самом файле (в проводнике Windows, а не из ED), действительно ли размер 600+ МБ? Если да, то что это за файл, чтобы я мог поиграть с ним?
Я добавил новый метод в класс 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" и посмотрите, решит ли это вашу проблему.