2015-01-22 4 views
0

проклятых я очень frustated ...Сжать DICOM файл с DCMTK (C++)

Следуя пример на этой странице http://support.dcmtk.org/docs/mod_dcmjpeg.html, я написал C++ программы для распаковки файлов DICOM изображений JPEG-сжатых

Теперь я хочу сделать наоборот: от несжатого до сжатого и если я использую другой пример на той же странице, с тем же (или другим файлом) код компилируется и запускается, но не может сжать файл ...

Я видел, что в следующем коде оригинал Xfer и ток те же, и это не хорошо, потому что нужно быть разным нт

dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params); 

Это как метод chooseRepresentation строй ....

Больше линии

dataset->canWriteXfer(EXS_JPEGProcess14SV1) 

возвращение ложного

Я видел, что в файле dcpixel.cc, с отладкой код введите

DcmPixelData::canChooseRepresentation(......... 
.... 
.... 
// representation not found, check if we have a codec that can create the 
// desired representation. 
if (original == repListEnd) 
    { 
    result = DcmCodecList::canChangeCoding(EXS_LittleEndianExplicit, toType.getXfer()); 
    } 

и результат FALSE ....

Как это исправить? Кто-то есть код, который работает, чтобы сжать DICOM изображение с DCMTK или другую библиотеку

Это полный код:

int main() 
{ 

    //dcxfer.h 
    DJDecoderRegistration::registerCodecs(); // register JPEG codecs 
    DcmFileFormat fileformat; 

    /**** MONO FILE ******/ 


    if (fileformat.loadFile("Files/cnv3DSlice (1)_cnv.dcm").good()) 
    { 
     DcmDataset *dataset = fileformat.getDataset(); 
     DcmItem *metaInfo = fileformat.getMetaInfo(); 
     DJ_RPLossless params; // codec parameters, we use the defaults 


     // this causes the lossless JPEG version of the dataset to be created 
     dataset->chooseRepresentation(EXS_JPEGProcess14SV1, &params); 

     // check if everything went well 
     if (dataset->canWriteXfer(EXS_JPEGProcess14SV1)) 
     { 
      // force the meta-header UIDs to be re-generated when storing the file 
      // since the UIDs in the data set may have changed 
      delete metaInfo->remove(DCM_MediaStorageSOPClassUID); 
      delete metaInfo->remove(DCM_MediaStorageSOPInstanceUID); 

      // store in lossless JPEG format 
      fileformat.saveFile("Files/test_jpeg_compresso.dcm", EXS_JPEGProcess14SV1); 
     } 
    } 

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

    return 0; 
} 

ответ

2

При попытке сжать изображение, которое нужно вызвать

DJEncoderRegistration::registerCodecs(); 

Декомпрессия

DJDecoderRegistration::registerCodecs(); 
+0

Черт! Два дня на этот материал ... Я забыл изменить регистрацию и очистку, когда копирую код из первой программы ... Многое много спасибо! -_- – GiordiX