tapitapi’s blog

1日1杯タピオカ!エンジニア

【Nuxt.js & Vue.js】 svgをpngに変換してダウンロード

f:id:kayo445:20200717182540g:plain

上記のように、左側のsvgを、pngに変換しダウンロードする方法を紹介します

 

大まかな流れは、

*imageタグを新規作成

svg内の描画をBase64形式に変換したものを、上記で作成したimageタグのsrc に設定

canvas内で上記のimageを描画(キャンバスに一旦描画しないとダウンロードできないため)

canvasの描画データをBase64形式に変換し、ダウンロードリンクのhrefにセット

 

画像にしたいsvgの描画については、下記などを参考に!

www.wakuwakubank.com

 

index.vue

<template>
 <div class="row">
  <div class="col-6">
   <svg id="artboard" xmlns="http://www.w3.org/2000/svg" style="background-color:#ccc" width="500" height="500" viewbox="0 0 500 500">

<!-- ここに、画像にしたいsvg描画 -->

   </svg>
  </div>
 <div class="col-6">
  <div><button @click="svg2imageData">変換する</button></div>
  <canvas id='converted-canvas' width="" height=""></canvas>
  <a v-show="show" :href="download_href" id="icon-download" type="application/octet-stream" download="your_icon.png">Download</a>
  </div>
 </div>
</template>

 

<script>
export default {
data () {
return {
show: false, // Downloadボタンを隠しておく
download_href: ' ' //Downloadする対象の画像は最初は無し
}
},
methods: {

// canvas 内にimage要素を追加するため、image要素を新規作成し、srcを設定する関数

loadImage(src)

// image作成には時間がかかるため、Promise使用
 return new Promise((resolve, reject) => {

 

// image要素を新規作成
 const img = new Image()

 

// new Image() が成功した場合、作成したimage要素を戻り値にする
 img.onload = () => resolve(img)

 

//new Image() が失敗した場合、エラーメッセージを戻り値にする
 img.onerror = (e) => reject(e)

 

// 引数を作成したimage要素のsrcにセット
 img.src = src
 })
},

// 変換するボタンがクリックされたら呼び出される関数
svg2imageData ()

// svgタグ内のelementを取得
 const svgElement = document.getElementById('artboard')

 

// elementからただの文字列に変換
 const svgData = new XMLSerializer().serializeToString(svgElement)

 

// 上記で変換した文字列をbase64形式に変換(canvasが処理できるように)
 const imgsrc = 'data:image/svg+xml;charset=utf-8;base64,' + btoa(unescape(encodeURIComponent(svgData)))

 

// 上記のloadimage関数を実行
 this.loadImage(imgsrc).then(img => {

 //this.loadImageが成功時の処理

 

//  ダウンロードボタンの要素を取得

const downloadBtn = document.getElementById('icon-download')

 

// ダウンロードボタンを表示するようにする
 this.show = true

 

// キャンバス要素を取得
 const canvas = document.getElementById('converted-canvas')

 

// svgの幅をキャンバスの幅にセット
 canvas.width = svgElement.width.baseVal.value

 

// svgの高さをキャンバスの高さにセット
 canvas.height = svgElement.height.baseVal.value

 

// キャンバス内に画像を描画するため、2Dコンテキストを取得
 const ctx = canvas.getContext('2d')

 

// キャンバス内に、loadimage関数で取得したイメージを描画
 ctx.drawImage(img, 0, 0, img.width, img.height)

 

// キャンバス内に描画したイメージをpng形式のbase64形式で変換し、ダウンロードできるようにdownload_hrefにセット
 this.download_href = canvas.toDataURL("image/png")
 }).catch(e => {

 

//this.loadImageでエラー時の処理
  console.log('onload error', e)
 })
}
}
};

</script>

 

 

以上ですー!

canvas.toDataURL("image/png")の部分を変更することでjpegなど他の形式や、画質も変更することができます

syncer.jp

 

おやすみなさい