Я борюсь с библиотекой DCMTK 3.6.1, и теперь я заблокирован в общей ситуации: доступ к пикселю сжатых данных изображения DICOM.
Как предлагают авторы библиотеки здесь http://support.dcmtk.org/redmine/projects/dcmtk/wiki/Howto_AccessingCompressedData, это правильный способ получить данные сжатия.
Этот код работает, но они начинаются с файла для создания набора данных.
В моем коде мой набор данных заполнен таким образом
status = data->putAndInsertUint8Array(DCM_PixelData, pSource, sizeBuffer);
где pSource содержит мои несжатые данные пикселей. После этого я добавляю теги Image DICOM (группа 28) и делаю сжатие с помощью
status = data->chooseRepresentation(EXS_JPEGProcess14SV1, ¶m);
и, начиная с этого набора данных, я хочу получить доступ к сжатым данным
status = data->findAndGetElement(DCM_PixelData, element);
DcmPixelData *dpix = NULL;
dpix = OFstatic_cast(DcmPixelData*, element);
/* Since we have compressed data, we must utilize DcmPixelSequence
in order to access it in raw format, e. g. for decompressing it
with an external library.
*/
DcmPixelSequence *dseq = NULL;
E_TransferSyntax xferSyntax = EXS_Unknown;
const DcmRepresentationParameter *rep = NULL;
// Find the key that is needed to access the right representation of the data within DCMTK
dpix->getOriginalRepresentationKey(xferSyntax, rep);
// Access original data representation and get result within pixel sequence
status = dpix->getEncapsulatedRepresentation(xferSyntax, rep, dseq);
Uint32 length;
if (status.good())
{
DcmPixelItem* pixitem = NULL;
// Access first frame (skipping offset table)
dseq->getItem(pixitem, 1);
if (pixitem == NULL)
return 1;
Uint8* pixData = NULL;
// Get the length of this pixel item (i.e. fragment, i.e. most of the time, the lenght of the frame)
length = pixitem->getLength();
if (length == 0)
return 1;
// Finally, get the compressed data for this pixel item
status = pixitem->getUint8Array(pixData);
// Metto i Pixel Data compressi su pSorgCompr
pSorgCompr = (LPBYTE)pixData;
}
////////////////////////////
DJEncoderRegistration::cleanup();
DJDecoderRegistration::cleanup();
но ряд status = dpix-> getEncapsulatedRepresentation (xferSyntax, rep, dseq); Повторите СБОЙ с ошибкой «Пиксельное представление не найдено», и я не понимаю, почему.
странная вещь если перед доступом к сжатым данным я сохраню сжатый файл с fileformat.saveFile («ressedPixelData.dcm », EXS_JPEGProcess14SV1); и затем я загружаю файл с result = fileformat.loadFile («ressedPixelData.dcm «);, все работает отлично
Это как функция loadfile решить проблему, я не знаю, как, может быть, заполнение некоторых тегов?
Теги, которые я заполняю перед вызовом функции chooseRepresentation:
Ну может у меня решена эта проблема. Я добавил istructions
dataset->removeAllButCurrentRepresentations();
перед доступом к сжатым данным пикселей.
Я тоже могу сделать
PixelData->removeAllButCurrentRepresentations();
вместо инструкции до и так же работает ….
Но я действительно не понимаю, почему это работает …. не могли бы вы попытаться объяснить?
Спасибо
В DICOM сжатые кадры сохраняются не так, как несжатые (собственные) кадры в элементе данных пикселей (7FE0, 0010). Вот основная концепция кодирования сжатых изображений в DICOM.
Инкапсулированный поток пикселей (сжатые данные изображения) сегментируется на один или несколько фрагментов (элементов) в элементе данных пикселей (7FE0, 0010) набора данных верхнего уровня. В инкапсулированном кодировании элемент данных пикселя является последовательностью и содержит два или более элементов элемента (фрагментов), причем каждый фрагмент (элемент элемента) имеет свою собственную явную длину. Кроме того, инкапсулированный формат поддерживает как однокадровое, так и многокадровое кодирование изображений. Кадр может целиком содержаться в одном фрагменте (элементе) или может охватывать несколько фрагментов. Последовательность фрагментов потока инкапсулированных пикселей заканчивается разделителем.
Первый элемент (FFFE, E000) в последовательности элементов перед закодированным потоком данных пикселей обычно пуст или может содержать элемент таблицы базовых смещений, который содержит смещения байтов в первый байт тега элемента первого фрагмента для каждого кадра в последовательности предметов.
Поэтому, когда вы хотите извлечь сжатый поток пикселей из набора данных DICOM, вам нужно пропустить первый элемент Item в последовательности данных пикселей. Я надеюсь, что это поможет понять документацию, на которую вы ссылаетесь. Пожалуйста, обратитесь к стандарту DICOM PS 3.5 Приложение A для получения дополнительной информации.