使用 DCMTK 压缩 DICOM 文件 (C++)

Compress DICOM file with DCMTK (C++)

本文关键字:C++ 文件 DICOM DCMTK 压缩 使用      更新时间:2023-10-16

该死的我很沮丧...

按照本页 http://support.dcmtk.org/docs/mod_dcmjpeg.html 中的示例,我编写了一个C++程序来解压缩JPEG压缩的DICOM图像文件

现在我想反之亦然,从未压缩到压缩,如果我在同一页面中使用另一个示例,使用相同的(或其他文件)代码编译并运行,但无法压缩文件......

我看到下面的代码,原来的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()); 
    } 

结果是错误的。

我该如何解决它?有人有一个代码可以使用DCMTK或其他库压缩DICOM图像

这是完整的代码:

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;
}

尝试压缩图像时,您需要调用

DJEncoderRegistration::registerCodecs();

解压缩是

DJDecoderRegistration::registerCodecs();