画像処理ライブラリ CImg

Big Spanish Castle - Color Illusion というのが面白くて、Web 上でそういう画像を生成するシステムを作ることにした。

コマンドでそのような画像処理を行うソフトを探したが見つからず、自作することにした。しかし libpng や libjpeg を使ったプログラムは敷居が高く、もっと簡単にできるものは無いかと検索して見つかったのが The CImg Library だ。

CImg は C++ のテンプレートを使ったライブラリで、CImg.h という単一のヘッダファイルから成る。GUI 表示は今回使わないが、X11 と Windows に対応しており、BSD や Linux、Mac OS X、Windows などで使える。

使うための手順は至って簡単で、ヘッダファイルを適当なディレクトリに置くだけ。ただし画像ファイルの読み込みには ImageMagick の convert が必要。Mac OS X なら Fink で入れる。

サンプルとして、lenna.jpg を読み込み、輝度値を 1.5 倍にして lenna-bright.jpg に保存するコード。こんなに簡単に書ける。*各輝度値が [0,255] に収まっていないピクセルは黒になるようです。

// GUI を使わない
#define cimg_display_type 0
#include "CImg.h"
using namespace cimg_library;

int main()
{
   // 各輝度値を float 型として扱う
   CImg<float> im("lenna.jpg");
   im *= 1.5;
   im.save("lenna-bright.jpg");
   return 0;
}

各画素にアクセスするには operator() (x, y, z, v) を使う。x, y には普通の座標の x, y で v にはチャネル (大抵はRGB) を指定する。z はよく分からない。

// (100, 100) の R チャネル
im(100, 100, 0, 0);

全画素に対して同じ処理を行うには cimg_mapXYZ マクロを使う。実体は for 文。他にも cimg_mapX とか cim_mapYZ とか色々ある。マクロは用法・用量を守って正しくお使いください。

// グレースケールにする
cimg_mapXYZ(im, x, y, z) {
   const float
      R = im(x, y, z, 0),
      G = im(x, y, z, 1),
      B = im(x, y, z, 2);
   const float
      Y = 0.299*R + 0.587*G + 0.114*B;
   im(x, y, z, 0) = im(x, y, z, 1) = im(x, y, z, 2)
      = (Y < 0 ? 0 : (Y > 255 ? 255 : Y));
}

以上簡単な紹介だが、このように本来の目的に集中できるライブラリは素晴らしいと思う。

日本語の解説文書がまだ無いようなので気が向いたらもう少し書いてみるつもり。

カテゴリ : 主にWeb開発

この記事に対する皆さんの反応

  1. ねこの足跡 :
    2006年10月15日 12:43 仕事メモ... ImageMagickが激重なため、Linuxで動作する良い画像処理ライブラリ、... (more...)
  2. 通りすがり :
    2007年3月7日 2:08 実行したらこのコードは真っ黒になるんですけどー・・・

コメントをどうぞ