1

ImageMagickのC++APIであるMagick++を使用してJPEG圧縮でTIFF画像を作成する際に問題が発生しました。変換ツールを次のように使用すると、機能します。

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..

Thread.cppファイルの103行目を指しています。

これはバグですか、それとも私のコードに何か問題がありますか?

アップデート

コードを次のように変更しました。

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を再コンパイルしてから、次の設定を追加しました。

追加のdirsを含める:

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

追加のlibdirs:

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を使用しています。同じ設定の他のプロジェクトで機能しなかった理由がわかりません...

4

1 に答える 1

4

ImageMagick Image Formatsによると、jpegサポートにはjpegsrc.v8c.tar.gzが必要です。リンクして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ライブラリを更新しようとすることができます。

于 2011-09-14T14:20:20.343 に答える