Я пытаюсь конвертировать диком .dcm
подать в .jpeg
использование Imebra в приложении C ++ с использованием Qt Creator в качестве среды разработки.
Я скачал 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();
}
Более глубокая отладка показала, что источник ошибки находится в JpegCodec.cpp
файл readStream()
Функция при проверке JpegSignature, чтобы увидеть, если он в неправильном формате, в результате чего внутренняя ошибка PUNTOEXE «обнаружил неправильный формат».
Интересно, что при запуске одного и того же тестового файла dcm с использованием данного примера dicom2jpeg (который имеет точно такой же код открытия и загрузки файла), не выдает ошибок и успешно конвертируется в jpeg. Так что я знаю, что проблема не в файле, а в том, как код imebra интегрируется в мое приложение C ++.
Моя среда разработки: MacBook Pro с Lion OS, Qt Creator, проект Qt, код C ++, добавлена библиотека ITK, файлы Imebra полностью интегрированы как часть проекта Qt.
Итак, мой вопрос: как мне работать / ссылаться / ссылаться / вызывать функционал Imebra в проекте Qt? Я забыл связать что-то, или какой-то объект не был создан / удален вовремя?
Любые идеи высоко ценятся,
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. Отчет об ошибке также содержит обходной путь.
Других решений пока нет …