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にしようかと思いました。