背景:
上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C++和C#环境下对DICOM图像的压缩。但是问题接踵而至啊,随着项目的深入,发现在单独的测试工程中可以实现的mDCM版本,在嵌入到项目整体中后,却意外地出现了错误,并未顺利实现DICOM图像的JPEG无损压缩。因此需要继续详细对比分析mDCM与DCMTK两者,期望寻找原因。
问题分析:
开启项目的日志功能后,得到的信息反馈为:
No registered codec for transfer syntax! 在 Dicom.Data.DcmDataset.ChangeTransferSyntax(DicomTransferSyntax newTransferSyntax, DcmCodecParameters parameters),在…………………………处。
从日志得到的反馈来看,应该是JPEG的编码器注册失败。而编码器部分包含在mDCM开源库的Dicom.Codec64.dll程序集中。因此单步调试进入,查看工程是否顺利加载了Dicom.Codec64.dll模块。
首先单步进入的是上周测试用的独立工程JpegLossLess,通过在Program.cs中调用Dicom.Codec.DicomCodec.RegisterCodecs();使得程序进入到DicomCodec.cs文件,程序运行到静态类DicomCodec的静态方法RegisterCodecs内。
如上图所示,方法RegisterCodecs内部通过C#的程序集的动态加载和反射技术,顺利识别了工程引用中添加的Dicom.dl程序集和Dicom.Codec64.dll程序集。
接下来单步调试到整体工程中,程序从主框架转移到我们手动添加的调用Dicom.Codec.DicomCodec.RegisterCodecs();函数处,如下图所示: