SVGを画像化する
はじめに
昨今のクライアントサイドでは、動的な画像のレンダリング、アニメーション、拡張・縮小を求められることが多々あります。そのような際にSVGは利用しやすい形式です。一方で、画像として内容を保存したくなることもあります。そのような場合に使える、SVG画像をPNG画像に変換する方法を簡単に述べます。
SVGとは
SVGファイル(スケーラブル・ベクター・グラフィックス、Scalable Vector Graphics)は画像形式の1つです。XMLをベースにした二次元ベクターデータで画像を描きます。ベクターデータとは「画像を、点の座標とそれを結ぶ線(ベクター、ベクトル)などの数値データをもとにして演算によって再現する方式」です。その大きな特徴は「拡大・縮小しても画質が損なわれない」ことです。
Illastratorなどでも作れますが、JavaScriptで簡単に作れます。実際にSVGを業務などでがっつりと利用するのであれば、d3jsがお勧めです。かなり扱いやすくできています。
実際の変換処理
やり方は非常に簡単で、以下の3ステップで可能です。
- SVG画像を作成する
- XMLSerializerを使ってSVG画像のデータを取り出す
- Canvasを使ってPNG形式に変換する
XMLSerializerは最新のブラウザであればほぼ使用可能です(詳細はこちら)。
コード
実際のコードは次のようになります。svg2jpeg関数にSVG要素(DOM)を渡すことで、PNG画像に変換します。変換処理では、SVG要素と同じサイズのCanvasを使い、Imageオブジェクトを利用してSVGデータをCanvasに貼り付けます。その後、CanvasのtoDataURL()メソッドを使用してPNG画像データを取り出します。
function svg2jpeg(svgElement, sucessCallback, errorCallback) {
var canvas = document.createElement('canvas');
canvas.width = svgElement.width.baseVal.value;
canvas.height = svgElement.height.baseVal.value;
var ctx = canvas.getContext('2d');
var