Monday, November 24, 2008

ImageMagickとPHPで指定された点を中心として徐々に画像を白黒化させる

Imagickで指定された点を中心として徐々に画像を白黒化させるには、以下のコードを実行します。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja" dir="ltr">
<head>
<title>sample703(ImageMagick6.4.4)</title>
</head>
<body>
<?php
/* 画像の指定された点を中心として徐々に白黒化する */
$cx = 150;
$cy = 100;
$cr = 150;
$im = new Imagick("sf.jpg");
$im->setImageMatte(true);

/* 指定された点から徐々に透明になるようにalphaを設定 */
$it = $im->getPixelIterator();
foreach($it as $py => $line){
foreach($line as $px => $pixel){
$pa = 1-sqrt(pow($cx-$px,2)+pow($cy-$py,2))/$cr;
$pa = $pa<0?0:$pa;
$pixel->setColorValue(Imagick::COLOR_ALPHA, $pa);
}
$it->syncIterator();
}
/* グレースケール画像と重ね合わせ */
$im2 = new Imagick("sf.jpg");
$it2 = $im2->getPixelIterator();
foreach($it2 as $py => $line){
foreach($line as $px => $pixel){
$pr = $pixel->getColorValue(Imagick::COLOR_RED);
$pg = $pixel->getColorValue(Imagick::COLOR_GREEN);
$pb = $pixel->getColorValue(Imagick::COLOR_BLUE);
$pixel->setColorValue(Imagick::COLOR_RED, ($pr+$pg+$pb)/3);
$pixel->setColorValue(Imagick::COLOR_GREEN, ($pr+$pg+$pb)/3);
$pixel->setColorValue(Imagick::COLOR_BLUE, ($pr+$pg+$pb)/3);
}
$it2->syncIterator();
}
$im2->compositeImage($im, Imagick::COMPOSITE_DEFAULT, 0, 0);
$im2->writeImage('sample703a.png');

$im2->destroy();
$im->destroy();
?>
<img src="sample703a.png" />

</body>
</html>

元画像(sf.jpg)


出力画像(sample703a.png)


関連項目
ImageMagickとPHPで青っぽいところ以外を白黒にする
ImageMagickで、マスクした部分を白黒に変換する
ImageMagickとPHPで、画像の緑っぽい所以外は白黒にする

No comments: