HTML5 の svg 要素 を canvas に描く方法
こうする
async function loadAsImage(svg) {
return new Promise((resolve, reject) => {
const svgXml = new XMLSerializer().serializeToString(svg);
const blob = new Blob([svgXml], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const img = new Image();
img.onload = () => {
URL.revokeObjectURL(url);
resolve(img);
};
img.onerror = (e) => {
URL.revokeObjectURL(url);
reject(e);
};
img.src = url;
console.log(url);
});
}
const img = await loadAsImage(svg);
ctx.drawImage(img, 0, 0); ポイント
XMLSerializer を使っているところ。svg.outerHTML だと HTML 的に解釈された svg なので、xmlns が入らず、単体の SVG としては正しくないものになっている。
ただ、ブラウザ自体は HTML の svg が xmlns を持っていることは知っているため、XMLSerializer を使うことで正しい svg にできる。
関連エントリー
- JS+SVGで液晶画面風の表示をつくる 液晶風の画面は決まった形をオン・オフするだけなので、canvas にコードで描くのは大変なだけで無駄が多い。かといってセグメントを1つ1つ画...
- HTML要素が見える範囲にあるかの判定 HTML上のある要素が見える範囲にあるかを JavaScript で判定したい。なんか1発で判定できるメソッドがあった気がしたが見つからなか...
- LAN 内の mDNS に応答するホストを列挙したい PTR _services._dns-sd._udp.local. A/AAAA [ソースアドレス].in-addr.arpa. をやりたい...
- mbed USBSerial を WebUSB から扱うには mbed USBDevice ライブラリの中に USB CDC で動く USBSerial クラスが実装されている。これを Web USB ...
- NMEA ログから衛星のスカイビューを生成する 既にある NMEA のログから、どの衛星が強く受信できているかをプロットしてみる。 ファイルを指定して png を書き出すコードを node...