PHPでSVGを取り扱う際に便利なライブラリ「meyfa/php-svg」のご紹介です。
順次追記します
環境
下記の環境で試しております。
github.com
なお、gdは必須です。
インストール
composerで導入します。
composer require meyfa/php-svg
もちろん手動導入も可能です。詳しくは、上記githubから。
テキストを使用する場合は、gd以外にも
--with-freetype-dir=/usr
拡張設定が必要です。
phpenvの場合は、
(MAC)
$HOME/.phpenv/plugins/php-build/share/php-build/default_configure_options
に先ほどの拡張設定を追記して、
phpenv uninstall [PHPバージョン]
phpenv install [PHPバージョン]
としてPHPをインストールしなおすのが簡単で良いかと思います。
使用方法
オブジェクト生成
SVGオブジェクトは下記のようにSVGテキストから生成します。全ての始まりです。
<?php
use SVG\SVG;
$svg = '<svg xmlns="http://www.w3.org/2000/svg" width="500" height="500" viewBox="0 0 500 500"></svg>';
$image = SVG::fromString($svg);
そのほか空のSVGオブジェクトを作成することも可能です。
ノードの追加
SVGオブジェクトに四角/円/テキストなどのノードを追加できます。
基本
ノードは概ね下記のように生成します。
<?php
$node = new SVGText('Hello World', 50, 50))
->setFont($font)
->setSize(40)
->setStyle('fill', '#f00')
ノードのスタイルは、
<?php
$node->setStyle([スタイル名], [スタイル値]);
のように指定します。
主なスタイルは下記の通り、
スタイル名 |
スタイル値 |
概要 |
fill |
カラーコード(例:#FFFFFF) |
塗りつぶし色 |
stroke |
カラーコード |
枠線の色 |
stroke-width |
サイズ(例:2px) |
枠線の太さ |
直線
<?php
use SVG\Nodes\Shapes\SVGLine;
$image->getDocument()->addChild(
(new SVGLine(0, 0, 50, 50))
->setStyle('stroke', '#f00')
->setStyle('stroke-width', 5)
);
四角 矩形
<?php
use SVG\Nodes\Shapes\SVGRect;
$image->getDocument()->addChild(
(new SVGRect(0, 0, 50, 50))
->setStyle('fill', '#f00')
);
テキスト
フォントが必要になります。どこかから入手してきましょう。
<?php
use SVG\Nodes\Structures\SVGFont;
use SVG\Nodes\Texts\SVGText;
$font = new SVGFont('IPAex明朝', "font/ipaexm.ttf");
$image->getDocument()->addChild($font);
$image->getDocument()->addChild(
(new SVGText('Hello World', 50, 50))
->setFont($font)
->setSize(40)
->setStyle('fill', '#f00')
);
なお太字(font-weight:bold)には対応していないようです。
setStyle('stroke-width', '1px')などで無理やり対応できないこともない。
画像
<?php
use SVG\Nodes\Embedded\SVGImage;
$image->getDocument()->addChild(
new SVGImage("image.jpg", 0, 0, 50, 50)
);
SVGの中身を確認したい場合は下記の通り
<?php
echo $image->toXMLString();
ラスタライズ
ラスタライズして画像に保存する場合は下記の通り。
<?php
$rasterImage = $image->toRasterImage($w, $h);
imagepng($rasterImage, "test.png"));
バージョン0.90現在、円にアンチエイリアスがかかっていません。
これはgdのimagefilledellipseがアンチエイリアスに対応していないためです。
meyfa/php-svgでは、SVGEllipseRenderer.phpの28行目の下記メソッドを書き換えることで、対応ができそうです。
<?php
protected function renderFill($image, array $params, $color)
{
imagefilledellipse($image, $params['cx'], $params['cy'], $params['width'], $params['height'], $color);
}
ですが、それも手間なので楽をしたい場合は、画像にしてしまうか、テキストで●を書くといいと思います。
その他仕様
下記のようなコードには対応していないようです。残念。
<svg>
<g transform="translate(100,100)">
~~~
</g>
</svg>