/**
* 引数の$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 件のコメント:
コメントを投稿