/** * 引数の$pathにあるファイル(アルファ付png想定)を$mattColorをマット色とした単色透過に変換 * @param string $path * @param string $mattColor "00ff00" // #なし16進数表現 * @return Imagick */ $effectMatt = function ($path, $mattColor) { $im = new Imagick($path); // mattColorのrgb表現を作っておく(かけ合わせ用) $mattRgb = array( 'r' => hexdec((int)substr($mattColor, 1, 2)), 'g' => hexdec((int)substr($mattColor, 3, 2)), 'b' => hexdec((int)substr($mattColor, -2)) ); // 色のアルファ合成関数 $combineAlpha = function ($dst, $src, $srcAlpha) { $res = $dst * (1.0 - $srcAlpha) + $src * $srcAlpha; return min(255, (int)$res); }; // 画像中の各ピクセルごとに処理 $imIte = $im->getPixelIterator(); foreach ($imIte as $iteY => $row) { foreach ($row as $iteX => $pixel) { // trueにするとdouble値、defaultのfalseは整数が返る $normalized = true; $tmp = $pixel->getColor($normalized); // r, g, b, a // 0.0=完全透明の場合と、1.0=完全不透明の場合はskip if (0.0 < $tmp['a'] && $tmp['a'] < 1.0) { $color = $pixel->getColor(! $normalized); // 0-255で再取得 $color = array( 'r' => $combineAlpha($mattRgb['r'], $color['r'], $tmp['a']), 'g' => $combineAlpha($mattRgb['g'], $color['g'], $tmp['a']), 'b' => $combineAlpha($mattRgb['b'], $color['b'], $tmp['a']) ); // setColor用引数文字列作成 $colorf = "rgb({$color['r']},{$color['g']},{$color['b']})"; $pixel->setColor($colorf); $i++; } } // 本画像へ反映 $imIte->syncIterator(); } return $im; };・マット色
単純に$im->setImageType("png8");とかしても単色透過は可能なのだけど、マット色が無くアルファ付のピクセルのデータは全て透明色になってしまった。
photoshopであるような背景色になじませるための色の設定がしたい。
・quantizeimageメソッド
http://www.php.net/manual/ja/imagick.quantizeimage.php
マニュアル見てもなんのことやら…
http://kyle-in-jp.blogspot.jp/2009/02/imagemagickphp_09.html
減色できるようだ。
0 件のコメント:
コメントを投稿