nmi.jp Twitter → @tkihira
SVGの使い方 SVGをCavnasで利用する方法

CanvasをSVGで利用する方法


2011-05-15
Takuo Kihira

HTML5を使っていると、Canvasの内容をSVGに書きだしたり、逆にSVGの内容をCanvasに書きだしたりしたくなることがあります。今回はその方法のうち、CanvasをSVGで利用する方法をお伝えします。

(SVGをCanvasで利用する方法はこちら

CanvasをSVGで利用するのは、contgextのtoDataURLを使って実装することが出来ます。

<!DOCTYPE html>
<html><head><title>Canvasの内容をSVGに出力する</title>
<script>
(function() {
    var width = 400, height = 300;
    // SVGのnamespace付きでElementを作成する
    var createElement = function(tag, attributes) {
        var ret = document.createElementNS("http://www.w3.org/2000/svg", tag);
        if(ret && attributes) {
            for(var key in attributes) {
                var value = attributes[key];
                ret.setAttribute(key, value);
            }
        }
        return ret;
    };
    // randomの値を返す
    var random = function(max) {
        return Math.floor(Math.random() * max);
    };
    window.onload = function() {
        var svg = createElement("svg", {width: width, height: height});
        document.body.appendChild(svg);
        var defs = createElement("defs");
        svg.appendChild(defs);
 
        var canvas = document.createElement("canvas");
        canvas.width = width;
        canvas.height = height;
        var ctx = canvas.getContext("2d");
        for(var i = 0; i < 10000; i++) {
            var x = random(width), y = random(height);
            ctx.fillStyle = "rgb(" + random(256) + "," + random(256) + "," + random(256) + ")";
            ctx.fillRect(x, y, random(width - x), random(height - y));
        }
 
        // fill用にpatternを作成
        var pattern = createElement("pattern",  {id: "img", x: 0, y: 0, width: width, height: height, patternUnits:"userSpaceOnUse"});
        defs.appendChild(pattern);
        // patternに使うimageを作成
        var image = createElement("image", {x: 0, y: 0, width: width, height: height});
        image.setAttributeNS("http://www.w3.org/1999/xlink", "href", canvas.toDataURL());
        pattern.appendChild(image);
 
        // 角丸の四角形を作り、上のパターンで塗りつぶす
        var rect = createElement("rect", {x: 0, y: 0, width: width, height: height, rx: 50, ry: 50, fill: "url(#img)"});
        svg.appendChild(rect);
    };
})();
</script></head>
<body>
</body></html>

簡単なコードの解説をします。

  • 今回は、SVGをJavaScriptで生成しています。SVGの名前空間でエレメントを作成する関数が7~16行目です
  • 22行目から25行目で、SVGを作ってbodyに追加しています。これでSVGが表示されます
  • 27行目から35行目でCanvasを作成し、適当な画像を生成しています。このCanvasをSVGに利用する予定です
  • 37~39行目で、patternの設定をしています。ここで設定したパターンをdefsに登録し、後に塗りスタイルで使います
  • 40~43行目が、Canvasの内容をSVGに利用しているところです。imageタグを作成し、そのhrefにCanvasのtoDataURLを指定しています。実際のSVGの中では、
    <image x="0" y="0" width="400" height="300" xlink:href="data:image/png;base64,~"></image>

    という形になります。xlinkのnamespaceを適用するのを忘れないようにしましょう。</li>

  • 46行目で、実際にその画像を使って、角丸の四角形を描画しています。
  • </ul>

    これの実行結果はこちらになります。


前の投稿 SVGの使い方