openpearでImage_GifColorConverterというgif画像の色変換するライブラリを公開しています

Image_GifColorConverter \ Package \ Openpear

概要

このライブラリはgif画像の色を素早く変換することだけに特化したものです。
gif画像は内部にカラーテーブルを持っています。このライブラリはそのカラーテーブルを書き換えることでgif画像の色を変換しています。
拡張ライブラリに依存しておらず、ピュアPHPで記述されています。
カラーテーブルを書き換えるだけなので軽いと思います。

使い方

小さなライブラリなので使い方は簡単です。
色変換の指定は24bitの整数の連想配列で表現します。

<?php

$converter = new Image_GifColorConverter;

// 変換した画像をファイルに書き出す
$converter->put('0.gif', '0_converted.gif', array(0x000000 => 0xff0000, 0xffffff => 0xcccccc)); 

// 変換した画像を標準出力に吐き出す
$converter->write('0.gif', array(0x000000 => 0xff0000, 0xffffff => 0xcccccc));

// 変換した画像のバイナリを得る
$binary = $converter->get('0.gif', array(0x000000 => 0xff0000, 0xffffff => 0xcccccc));

// ストリームから得た画像の色を変換して他のストリームに書き出す
$in = fopen('0.gif', 'rb');
$out = fopen('0_converted.gif', 'wb');
$converter->convert($in, $out, array(0x000000 => 0xff0000, 0xffffff => 0xcccccc));
fclose($out);
fclose($in);

// 色の変換などに失敗した場合、Image_GifColorConverter_Exceptionが投げられる
try {
    $converter->put('0.gif', '0_converter.gif', array(0x000000 => 0xff0000, 0xffffff => 0xcccccc));
}
catch (Image_GifColorConverter_Exception $e) {
    echo '失敗: ' . $e->getMessage();
}

上のコードでの最初の例の場合、結果は以下のようになります。

http://svn.openpear.org/Image_GifColorConverter/trunk/sample/0.gif 変換前
http://svn.openpear.org/Image_GifColorConverter/trunk/sample/0_converted.gif 変換後

#000000(黒)が#ff0000(赤)に、#ffffff(白)が#cccccc(灰色)に変換されているのがわかります。

使い道

どうしてこういったライブラリを作る必要があったのか。
例えばtwitterというウェブサービスで話をします。
twitterのユーザは自分のタイムラインを見ることのできるページを持つわけですが、ユーザは自分のページの配色や背景画像を設定で変えることが出来ます。他の色んなウェブサービスでもありがちな機能だと思います。

ユーザが好きなように色を設定したとき、文字の色だったり背景の色などはCSSを動的に吐いてやればいいので話は簡単ですが、デザインにユーザの配色と調和する必要のある画像(角丸画像とか)を使っている場合は画像の色を動的に変える手段が必要になります。
ユーザが選ぶ配色に調和する必要のある画像を使わないという選択肢もあり(実際twitterはそうしてる)ですが、こういう制約でサービスのデザインの幅を狭めるのはちょっと嫌だし、実際問題nimpadではそういった画像をユーザのページでいくつか使っているので、このライブラリを書きました。

終わりに

バグ報告や要望等、開発に貢献する方は気軽にコメントください。