2014年5月1日木曜日

PHP, ImagickでNeon系装飾で文字を入れる

Neonというか覆い焼き
例:

$TEXT      = "example example!";
$FONT_SIZE = 32;
$FWCOLOR   = "#FFFFFF";
$BGCOLOR   = "#FF0000";

// 貼り付け先の画像
$im = new Imagick();
$im->readImageBlob(file_get_contents('/path/to/baseimagefile'));

// 文字入れ作業用の画像
$tmp = new Imagick();
$tmp->newImage($im->getImageWidth(), $im->getImageHeight(), "transparent", "png");
$tmp2 = clone $tmp;

// 文字入れ用の設定
$draw = new ImagickDraw();
//$draw->setFont('/path/to/font/file');
$draw->setFontSize($FONT_SIZE);
$draw->setGravity(Imagick::GRAVITY_CENTER);

// 文字:ぼかし下地
$draw->setFillColor($BGCOLOR);
$tmp->annotateImage($draw, 0, 0, 0, $TEXT);
$tmp->blurImage($FONT_SIZE / 8, $FONT_SIZE / 10, Imagick::CHANNEL_ALL);
// 文字:全面に来る文字部分
$draw->setFillColor($FWCOLOR);
$tmp->annotateImage($draw, 0, 0, 0, $TEXT);
// 文字:ぼかし調整
$draw->setFillColor($BGCOLOR);
$tmp2->annotateImage($draw, 0, 0, 0, $TEXT);
$tmp2->blurImage(5, 3, Imagick::CHANNEL_ALL);
$tmp->compositeImage($tmp2, Imagick::COMPOSITE_COLORDODGE, 0, 0);

// 最終画像結合
$im->compositeImage($tmp, Imagick::COMPOSITE_COLORDODGE, 0, 0);

// 出力
//$output = $im->getImagesBlob();
//header('Content-Type: ' . $im->getimagemimetype());
//echo $output;


ポイントは
・Imagick::blurImage()で適度にぼかす
・Imagick::compositeImage()でImagick::COMPOSITE_COLORDODGE(覆い焼き)をする

単に一度だけの合成だとネオン効果が弱い気がするのでぼかし下地で強化。