Tuesday, March 10, 2009

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>sample907(ImageMagick6.4.8)</title>
</head>
<body>
<?php
/* 画像を荒いドットを交互に配置したモザイク画像に変換する */
$dx=10;
$dy=10;
$fn="sf.jpg";
$im = new Imagick($fn);
$w=$im->getImageWidth();
$h=$im->getImageHeight();
/* 左端の余白イメージを作成 */
$im2 = new Imagick($fn);
$im2->cropImage(1, $h, 0, 0);
$im2->resizeImage($dx/2, $h, Imagick::FILTER_POINT, 1);
/* 右端の余白イメージを作成 */
$im3 = new Imagick($fn);
$im3->cropImage(1, $h, $w-1, 0);
$im3->resizeImage($dx/2, $h, Imagick::FILTER_POINT, 1);
/* 横方向に連結 */
$im2->addImage($im);
$im2->addImage($im3);
$im2->setImageIndex(0);
$im4 = $im2->appendImages(false);
/* 縮小 */
$im4->resizeImage($w/$dx+1, $h/$dy,
Imagick::FILTER_MITCHELL, 1);
/* 偶数ラインを透明に */
$im4->setImageMatte(true);
$it = $im4->getPixelIterator();
foreach($it as $py => $line){
foreach($line as $px => $pixel){
if( $py%2 == 0 ){
$pixel->setColorValue(Imagick::COLOR_ALPHA, 0);
}
}
$it->syncIterator();
}
/* 拡大&余白の切り取り */
$im4->resizeImage($w+$dx,
$im->getImageHeight(),
Imagick::FILTER_POINT, 0);
$im4->cropImage($w, $h, $dx/2, 0);
/* 元画像を縮小&拡大 */
$im->resizeImage($w/$dx, $h/$dy,
Imagick::FILTER_MITCHELL, 1);
$im->resizeImage($w, $h, Imagick::FILTER_POINT, 1);

/* 重ね合わせ */
$im->compositeImage($im4, Imagick::COMPOSITE_OVER,
0, 0, Imagick::CHANNEL_ALL);
$im->writeImage('sample907a.png');
$im4->destroy();
$im3->destroy();
$im2->destroy();
$im->destroy();
?>
<img src="sample907a.png" /><br />

</body>
</html>


元画像(sf.jpg)


出力画像(sample907a.png)


関連項目
ImageMagickとPHPで、画像を荒いドット画像に変換する

No comments: