Распакуйте изображение JPEG DICOM, начиная со значений PixelData (DCMTK)

Я хочу распаковать файл DICOM, используя DCMTK, как в этом примере http://support.dcmtk.org/docs/mod_dcmjpeg.html
Но моя проблема в том, что я не хочу загружать файл.

У меня есть массив, внутри которого есть значения PixelData Compressed. Я пытался таким образом, но не работает.

DJDecoderRegistration::registerCodecs();
DJEncoderRegistration::registerCodecs();

DcmFileFormat fileformat;
DJ_RPLossless param_lossless;

DcmDataset *pDataset = fileformat.getDataset();
pDataset->chooseRepresentation(EXS_JPEGProcess14SV1, &param_lossless);

BYTE*   pBufferImg = (BYTE*)pArray->ImgDicom.GetAt(0); //here I have my PixelData
//I put it into my dataset
pDataset->putAndInsertUint8Array(DCM_PixelData, pBufferImg, pArray->NumByteImg);
//decompress
OFCondition status = pDataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL); //status is OK
...
//add all the tags like Rows, Columuns, BitStored, etc
...
if (pDataset->canWriteXfer(EXS_LittleEndianExplicit))
{
fileformat.saveFile("test.dcm", EXS_LittleEndianExplicit);
}

DJDecoderRegistration::cleanup(); // deregister JPEG codecs
DJEncoderRegistration::cleanup();

Файл test.dcm создан, но я не могу его открыть (сбой бесплатного программного обеспечения Dicom Viewr), а размер равен сжатому файлу, поэтому процедура декодирования не работает … В чем моя ошибка?

Я также попробовал:

DcmElement * dummyElem;
pDataset->findAndGetElement(DCM_PixelData, dummyElem);

Uint32 frameSize;
dummyElem->getUncompressedFrameSize(pDataset, frameSize);

BYTE* buf = new BYTE[frameSize];
OFString decompressedColorModel;
Uint32 startFragment = 0;

dummyElem->getUncompressedFrame(pDataset, 0, startFragment, buf, frameSize, decompressedColorModel);

pDataset->putAndInsertUint8Array(DCM_PixelData, (const Uint8*)buf, frameSize);
pDataset->removeAllButCurrentRepresentations();
//check if everything went well
if (pDataset->canWriteXfer(EXS_LittleEndianExplicit))
{
fileformat.saveFile("test.dcm", EXS_LittleEndianExplicit);
}

getUncompressedFrame вернуть ошибку «Запрошено слишком много байтов»
Если использовать frameSize - 1 вместо frameSize у меня появляется ошибка «Недопустимый вызов, возможно, неверный параметр» … но почему?!?

0

Решение

Ну, благодаря официальному форуму DICOM, я обнаружил
Image2Dcm::insertEncapsulatedPixelData() функция, которая делает именно то, что мне нужно.

0

Другие решения


По вопросам рекламы [email protected]