ImageMagickを使おうとしたけどやめた
Direct3Dのバックバッファを数枚〜数十枚連結して保存したいなぁと思って、ImageMagickを使うことにしました。いろんなフォーマット保存できるといいよねってことで。単にバックバッファ保存ならD3DXSaveSurfaceToFileで一発なんですが、そうもいかないんです。
ImageMagickといっても色々ありますが、使ったのはC++用のMagick++。バイナリはこの辺から適当に。基本は8bppのdynamic版かと思います。ここで注意なのが、dynamicとstaticがライブラリのことを指しているわけではないということ。最初staticのほうはstatic linkできるライブラリなのかなぁと思ってたんですが、全然違うようでした。dynamicのほうを使いましょう。
DLLは、インストールされたディレクトリにごっそり入ってます。この数がとにかく多い。CORE_RL_で始まるImageMagick関連と思われるDLLから、X11.dllなんてところまで、合計16個。全部が必要かよく分からなかったので、とりあえず全部EXEと同じ場所に放り込んでみました。あと、リンクするライブラリはlibに、includeするヘッダはincludeにあります。普通です。
使い方は割と簡単。まず画像を作るときはMagick++.hをincludeして、
Magick::Image image(Magick::Geometry(w, h), "black")); image.type(MagickLib::TrueColorType);
次に画像にドットを打っていくには
MagickLib::PixelPacket* pixel = image.getPixels(dx, dy, dw, dh); for (int y = 0; y < dh; ++y) { for (int x = 0; x < dw; ++x) { pixel->red = 255; pixel->blue = 255; pixel->green = 10; ++pixel; } }
とします。ぱっとみgetPixelsが曲者です。気分的にはDirect3Dで言うところのLockRectだと思えば。これと似たものでsetPixelsもあるんですが、引数も戻り値も同じでちょっとよく分かってません。画面外にも描けるとか?
で、とりあえず目的は達成できたんですが、VS2008使ってる開発メンバーがどうやらうまく行かないとのこと。結局保存フォーマットもpngぐらいしか使わなさそうだし、おとなしくlibpngにしようかと思いました。