我正在尝试使用QT Creator作为开发环境中的C 应用中使用iMebra将DICOM .dcm
文件转换为.jpeg
。
我已经下载了Imebra,并且能够成功地为DICOM2JPEG转换运行QT项目示例。但是,当我尝试将相同的代码复制到我的C 应用时,它无法运行以下错误msg:
malloc: *** error for object xxxxxx: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
我遵循了在Imebra网站上显示的项目中添加Imebra文件的步骤。还以他们的QT项目为例。我的main.cpp
打开DICOM文件,然后将其加载到数据集,然后调用我的对话框窗口。它在加载数据集上崩溃。
#include "QApplication.h"
#include "QHBoxLayout.h"
#include "mydialog.h"
#include "iostream.h"
include "library/imebra/include/imebra.h"
int main( int argc, char ** argv ){
using namespace puntoexe;
ptr<stream> readStream(new stream);
readStream->openFile("/pathToDcmFile/test.dcm",std::ios_base::in);
ptr<streamReader> reader(new streamReader(readStream));
ptr<imebra::codecs::codecFactory>
cFactory(imebra::codecs::codecFactory::getCodecFactory());
ptr<imebra::dataSet> tdataSet;
tdataSet=cFactory->load(reader,2048);
Q_INIT_RESOURCE(images);
QApplication a( argc, argv );
MyDialog md;
md.show();
return a.exec();
}
更深入的调试显示,在检查jpegsignature时,JpegCodec.cpp
文件 readStream()
函数中的错误源是在查看是否处于错误格式的情况下,导致内部puntoexe错误"检测到错误的格式"。
有趣的是,使用给定的DICOM2JPEG示例运行相同的测试DCM文件(在打开文件和加载的代码完全相同的代码)中没有任何错误,并且成功地转换为JPEG。所以我知道这不是文件问题,而是Imebra代码集成到我的C 应用程序中的方式。
我的开发环境:带有狮子OS,QT创建者,QT项目,C 代码的MacBook Pro,添加了ITK库,IMEBRA文件已完全集成为QT项目的一部分。
那么,我的问题是如何在QT项目中工作/链接/参考/调用Imebra功能?我是否忘记链接某些东西,或者某些对象未按时实例化/删除?
任何想法都得到高度赞赏,
evushka
解决方案:正如建议的那样,我将编解码器工厂更改为DICM工厂,并解决了问题。我的新代码在下面给出。
imebra::codecs::dicomCodec* pTmp = new imebra::codecs::dicomCodec();
ptr<stream> readStream(new stream);
readStream->openFile(argv[0],std::ios_base::in);
ptr<streamReader> reader(new streamReader(readStream));
ptr<imebra::dataSet> tdataSet;
tdataSet=pTmp->read(reader,2048);
delete pTmp;
错误"检测到错误的格式"被抛出,因为库对所有文件格式检查文件,并且由于您正在读取DICOM文件,然后JPEG代码会引发例外,但是这应该由编解码器工厂恢复。您可能是此错误的受害者:https://bitbucket.org/puntoexe/imebra/issue/89/,它阻止了DICOM编解码器在启动时静态注册,从而使工厂编解码器完全跳过DICOM Codec。该错误报告还包含解决方法。