Магия ++ - JPEG сжатый TIFF - PullRequest
       22

Магия ++ - JPEG сжатый TIFF

1 голос
/ 22 августа 2011

У меня проблема с созданием изображения TIFF со сжатием JPEG с использованием Magick ++, C ++ API ImageMagick.Когда я использую инструмент преобразования следующим образом, он работает:

convert 1.jpg -compress JPEG 1.tiff

Когда я хочу сделать то же самое в C ++, это выглядит так:

Image img("1.jpg");
img.compressType(JPEGCompression);
img.write("1.tiff");

Но этот код делает не работа.Он генерирует исключение при попытке создать файл «1.tiff»:

Unhandled exception at 0x74ecb727 in test.exe: Microsoft C++ exception: Magick::ErrorCoder at memory location 0x002ffc2c..

Указывает на Строка 103 в файле Thread.cpp

Это ошибка или что-то не так с моим кодом?

Обновление

Я изменил код на это:

try{
    Image img(Desktop+"1.jpg");
    img.compressType(JPEGCompression);
    img.write(Desktop+"1.tiff");
}catch(Exception e){
    cout << e.what() << endl;
}

Вывод: test.exe: CompressionNotSupported `JPEG '@ error / tiff.c / WriteTIFFImage / 2611

Итак ... похоже, что он не поддерживается.Вопрос в том, почему он поддерживает инструмент преобразования?Кто-нибудь знает способ сделать это?

Обновление

Я создал пустой новый проект, перекомпилировал ImageMagick, а затем добавил следующие параметры:

дополнительные каталоги:

c:/imagemagick/magick++/lib;c:/imagemagick/

дополнительные каталоги lib:

c:/imagemagick/visualmagick/lib/

libs:

CORE_RL_bzlib_.lib;CORE_RL_coders_.lib;CORE_RL_filters_.lib;CORE_RL_jbig_.lib;CORE_RL_jp2_.lib;CORE_RL_jpeg_.lib;CORE_RL_lcms_.lib;CORE_RL_libxml_.lib;CORE_RL_magick_.lib;CORE_RL_Magick++_.lib;CORE_RL_png_.lib;CORE_RL_tiff_.lib;CORE_RL_ttf_.lib;CORE_RL_wand_.lib;CORE_RL_xlib_.lib;CORE_RL_zlib_.lib;CORE_RL_wmf_.lib;X11.lib;Xext.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;wsock32.lib;winmm.lib;

, а затем попытался запустить следующий код:

#include <iostream>
#include <Magick++.h>

using namespace std;
using namespace Magick;

int main() {
    Image img("c:/users/patrik stutz/Desktop/1.jpg");
    img.compressType(JPEGCompression);
    img.write("c:/users/patrik stutz/Desktop/1.tiff");
    return 0;
}

И это сработало !!Все с использованием VS2010.Понятия не имею, почему он не работал в моем другом проекте с такими же настройками ...

1 Ответ

3 голосов
/ 14 сентября 2011

В соответствии с форматами изображений ImageMagick вам потребуется jpegsrc.v8c.tar.gz для поддержки jpeg.Вы должны связаться с libjpeg и libtiff, чтобы заставить его работать.Вы можете создать все необходимые флаги компоновщика, используя эту команду:

Magick++-config --cppflags --cxxflags --ldflags --libs

Для меня работает следующий код:

#include <Magick++.h>
#include <iostream>
using namespace std;
using namespace Magick;

int main() {
    Image img("1.jpg");
    img.compressType(JPEGCompression);
    img.write("1.tiff");
    return 0;
}

Используя эту команду компилятора:

g++ -L/usr/lib -L/usr/lib/X11 -o"testim"  ./src/testim.o -lMagick++ -lMagickWand -lMagickCore -llcms -ltiff -lfreetype -ljpeg -llqr-1 -lglib-2.0 -lfontconfig -lXext -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lgomp -lpthread -lltdl

Обновление : Я только что увидел, что ваша ошибка возникла из вашей библиотеки TIFF.ImageMagick использует TIFFGetConfiguredCODECs() для получения поддерживаемых кодеков сжатия.Таким образом, ваша библиотека TIFF должна поддерживать сжатие JPEG.Может быть, вы можете попробовать обновить свою библиотеку TIFF.

...