ImageMagick(MagickWand)でベクトル画像(SVG)をJPEGへ変換する

お仕事の関係で、 独自フォーマットのベクトル画像情報を、C言語のアプリからJPEGに変換したいという依頼がありました。 調べてみると、 まず SVG という XML形式の画像フォーマットに変換できれば、 ImageMagick を使って JPEG に変換できるとのこと。
参考までに、その方法は、
 convert hogehoge.svg hogehoge.jpg
とするだけ。簡単ですね。
でも、 system() でシェルなりなんなりを呼ぶのはなるべく避けたいので、 MagickWand を利用して実現することにしました。
まず、 環境作りから。 CentOS release 4.8 で確認しましたが、 他の RH 系は皆同じかも? ImageMagick-devel を入れてもコンパイルに必要なヘッダとかがインストールされないので、 下記手順を行いました。
●ImageMagick のアンインストール
※rpmで入っているものはヘッダファイルが入れられないため、入れ直す。
# rpm -e ImageMagick
●ImageMagick をソースからインストール
※下記ファイルがカレントディレクトリにあるものとする。
ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
# tar xvfz ImageMagick.tar.gz
# cd ImageMagick-6.6.5-0
# ./configure
# make
# make install
●共有ライブラリにImageMagickを追加
# echo /usr/local/lib >> /etc/ld.so.conf.d/usrlocal.conf
# ldconfig
上記が終わった環境で、コンパイルは次のとおりにします。
ここでは、サンプルのwand.cをコンパイルしています。
(/usr/local/bin にパスがはられている必要があります)
$ cc `MagickWand-config –cflags –cppflags` -O2 \
`MagickWand-config –ldflags –libs` -o wand wand.c
で、 最後に SVGをJPEGへ変更するサンプルソース。

#include <stdio.h>
#include <stdlib.h>
#include <wand/MagickWand.h>
int main(int argc,char **argv)
{
#define ThrowWandException(wand) \
{ \
char \
*description; \
\
ExceptionType \
severity; \
\
description=MagickGetException(wand,&severity); \
(void) fprintf(stderr,"%s %s %u %s\n",GetMagickModule(),description); \
description=(char *) MagickRelinquishMemory(description); \
exit(-1); \
}
MagickBooleanType   status;
MagickWand          *magick_wand;
if (argc != 3)
{
(void) fprintf(stdout,"Usage: %s imagefile(from) imagefile(to)\n",argv[0]);
exit(0);
}
/*
Read an image.
*/
MagickWandGenesis();
magick_wand=NewMagickWand();
status=MagickReadImage(magick_wand,argv[1]);
if (status == MagickFalse)
ThrowWandException(magick_wand);
MagickResetIterator(magick_wand);
/*
Convert to JPEG
*/
status=MagickSetFormat(magick_wand, "JPEG");
if (status == MagickFalse)
ThrowWandException(magick_wand);
/*
Write the image then destroy it.
*/
status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
if (status == MagickFalse)
ThrowWandException(magick_wand);
magick_wand=DestroyMagickWand(magick_wand);
MagickWandTerminus();
return(0);
}

なお、この記事は、ImageMagick: MagickWand, C API for ImageMagick を参考にさせていただきました。

関連した記事:

投稿時刻: 12:20 PM | カテゴリー: Linux | パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です