画像のピクセルの色を解析する

kashiwagiyukiここ一週間ぐらいずっと画像の色解析をしていました。ImageMagickとかGDあたりで何とかできるんじゃないかと思っていたのだけど、やっぱりありました。
imagecreatefrompng();
っていう関数です。残念ながらずべての画像形式に対応しているわけじゃなくてPNGのみです。私の使っているサーバーではこの関数が普通に使えましたが、GDとその周辺のライブラリーに強度に依存しているのでエラーが出ることもしばしばらしいです。GDをソースからコンパイルしないと使えない関数だとかいう情報もありました。別のサーバーで使うことになったらその時また新しい情報をご提供します。
で、この関数ですが、画像のピクセルを座標で指定するとそのピクセルの色を拾ってくれます。返り値はRGB数値なので0-255です。今回は画像内のピクセルをすべて解析しろということだったので、テストとしてdivでそのまま描画してみました。Sample

$image = 'kashiwagi.png';

print "<div style='font-size:9px;width:1000px'>";
$y=0;
for ($y=0;$y<100;$y++) {
for ($x=0;$x<100;$x++) {
//print $x.'-'.$y.' ';
$color = pickupDottColor16 ($image,$x,$y);
if ($color == '') {
$color='#000000';
}
print "<div id='block' style='float:left;width:10px;height:10px;background:".$color.";'></div>";
}
}
print "</div><br>¥n";

function pickupDottColor16 ($image,$x,$y) {
$setImage = imagecreatefrompng($image);
$rgb = imagecolorat($setImage,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$r = dechex($r);
$g = dechex($g);
$b = dechex($b);

$rgb16_color = '#'.$r.$g.$b;

return $rgb16_color;
}

やっていることはすこぶる簡単で返ってきた値を16進数にして並べるだけです。100x100でたいした大きさはないのですが、それでも重いです。本来やろうとしていたことは、こちらの画像色の解析とともに、ある画像が投稿されたらその画像が小さいサムネイルとなってある絵を描画するというものです。いってみればちょっと昔の人文字みたいなものです。北朝鮮では今でもリアルタイムでやっておりますが。