Thursday, June 11, 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>sample1111(ImageMagick6.5.2)</title>
</head>
<body>
<?php
/* 画像サイズ */
$iw=225;
$ih=200;
/* 折曲がったラベルの左上 */
$bx=0;
$by=25;
/* 折曲がったラベルのサイズ */
$bw=160;
$bh=40;
/* 角丸と吹き出し線 */
$rx=15;
$ry=15;
/* 背景色 */
$bc="none";
/* 塗りつぶし色 */
$fc="#e0e0e8ff";
/* ストローク色 */
$sc="#405080ff";
/* ストローク幅 */
$lw=2;
/* 文字色 */
$tc = "#405080ff";

$im = new Imagick();
$im->newImage($iw, $ih, $bc);
$im->setImageMatte(true);
$idraw = new ImagickDraw();
$idraw->setFillColor($fc);
$idraw->setStrokeColor($sc);
$idraw->setStrokeWidth($lw);
/* 左下の裏側部分 */
$idraw->pathStart();
$idraw->pathMoveToAbsolute(
$bx+$rx, $by+$bh-1);
$idraw->pathEllipticArcAbsolute(
$rx, $ry, 0, false, false,
$bx+$rx, $by+$bh+$ry*2-1);
$idraw->pathFinish();

$idraw->pathStart();
/* 左上の角丸 */
$idraw->pathMoveToAbsolute($bx, $by+$ry);
$idraw->pathEllipticArcAbsolute(
$rx, $ry, 0, false, true, $bx+$rx, $by);
/* 上側の線 */
$idraw->pathLineToAbsolute($bx+$bw-$rx-1, $by);
/* 右上の角丸 */
$idraw->pathEllipticArcAbsolute(
$rx, $ry, 0, false, true, $bx+$bw-1, $by+$ry);
/* 右側の線 */
$idraw->pathLineToAbsolute(
$bx+$bw-1, $by+$bh-$ry-1);
/* 右下の角丸 */
$idraw->pathEllipticArcAbsolute(
$rx, $ry, 0, false, true,
$bx+$bw-$rx-1, $by+$bh-1);
/* 下側の線 */
$idraw->pathLineToAbsolute($bx+$rx, $by+$bh-1);
/* 左下の曲線 */
$idraw->pathEllipticArcAbsolute(
$rx, $ry, 0, false, false,
$bx, $by+$bh+$ry-1);
$idraw->pathClose();

$im->drawImage($idraw);

$im->writeImage('sample1111a.png');

/* 重ねあわせ例 */
$im2 = new Imagick();
$im2->newImage($iw, $ih, $bc);
$im3 = new Imagick("sf.jpg");
$im2->compositeImage($im3, Imagick::COMPOSITE_OVER,
$rx+$lw/2, 0, Imagick::CHANNEL_ALL);
$im2->compositeImage($im, Imagick::COMPOSITE_OVER,
0, 0, Imagick::CHANNEL_ALL);

$idraw2 = new ImagickDraw();
/* フォント設定 */
$idraw2->setFont('C:\\Windows\\Fonts\\MSGOTHIC.TTC');
/* フォントサイズ設定 */
$idraw2->setFontSize(20);
$idraw2->setFillColor($tc);
$idraw2->setStrokeColor("none");
$idraw2->annotation($bx+$rx, $by+$ry+15,
"San Francisco");
$im2->drawImage($idraw2);

$im2->writeImage('sample1111b.png');

$im3->destroy();
$im2->destroy();
$im->destroy();
?>
<img src="sample1111a.png" /><br />
<img src="sample1111b.png" /><br />

</body>
</html>


元画像(sf.jpg)


出力画像1(sample1111a.png)


出力画像2(sample1111b.png)
Imagickで描画した折れ曲がったラベル

No comments: