2

我正在尝试使用 Qt Creator 作为开发环境将 dicom.dcm文件转换为.jpeg在 C++ 应用程序中使用 Imebra。

我已经下载了 Imebra,并且能够成功运行 Qt 项目示例以进行 Dicom2Jpeg 转换。但是当我尝试将相同的代码复制到我的 C++ 应用程序时,它无法运行并出现以下错误消息:

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++ 应用程序中的方式。

我的开发环境:带有 Lion OS、Qt Creator、Qt 项目、C++ 代码、添加了 ITK 库的 macbook pro、Imebra 文件完全集成为 Qt 项目的一部分。

所以,我的问题是如何在 Qt 项目中工作/链接/引用/调用 Imebra 功能?我是否忘记链接某些东西,或者某些对象没有按时实例​​化/删除?

任何想法都受到高度赞赏,

埃武什卡

解决方案:正如建议的那样,我已将编解码器工厂更改为 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;
4

1 回答 1

0

抛出错误“检测到错误的格式”是因为库会根据所有文件格式检查文件,并且由于您正在读取 Dicom 文件,因此 Jpeg 代码会引发异常,但这应该由编解码器工厂恢复。您可能是此错误的受害者: https ://bitbucket.org/puntoexe/imebra/issue/89/ ,它阻止 Dicom 编解码器在启动时静态注册,导致工厂编解码器完全跳过 Dicom 编解码器。该错误报告还包含一个解决方法。

于 2012-11-03T16:46:08.537 回答