使用 DCMTK (C++) 压缩 DICOM 文件
Compress DICOM file with DCMTK (C++)
妈的我很沮丧...
按照本页中的示例 http://support.dcmtk.org/docs/mod_dcmjpeg.html,我编写了一个 C++ 程序来解压缩 JPEG 压缩的 DICOM 图像文件
现在我想反之亦然,从未压缩到压缩,如果我在同一页面中使用另一个示例,使用相同(或其他文件)代码编译和 运行 但不是能够压缩文件...
看了下面的代码,原来的Xfer和Current是一样的,这个不好,需要不同
dataset->chooseRepresentation(EXS_JPEGProcess14SV1, ¶ms);
好像chooseRepresentation
方法失败了....
更多行
dataset->canWriteXfer(EXS_JPEGProcess14SV1)
return 假
我在 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, ¶ms);
// 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();
妈的我很沮丧...
按照本页中的示例 http://support.dcmtk.org/docs/mod_dcmjpeg.html,我编写了一个 C++ 程序来解压缩 JPEG 压缩的 DICOM 图像文件
现在我想反之亦然,从未压缩到压缩,如果我在同一页面中使用另一个示例,使用相同(或其他文件)代码编译和 运行 但不是能够压缩文件...
看了下面的代码,原来的Xfer和Current是一样的,这个不好,需要不同
dataset->chooseRepresentation(EXS_JPEGProcess14SV1, ¶ms);
好像chooseRepresentation
方法失败了....
更多行
dataset->canWriteXfer(EXS_JPEGProcess14SV1)
return 假
我在 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, ¶ms);
// 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();