2014年5月22日木曜日

PHPのバックトレースを程よい文字列で取得

バックトレースを文字列で欲しい場合。
・debug_print_backtrace()では出力してしまうのでoutput bufferなどでの補足が必要で微妙。
・debug_backtrace(); は配列なので冗長。。もっとコンパクトにまとまってて欲しい。

と思ってたんだけど、PHPマニュアルのコメント欄でいいものを見つけた。
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
from http://www.php.net/manual/ja/function.debug-print-backtrace.php#92542

これくらいの出力がちょうどいい。

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(覆い焼き)をする

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