iT邦幫忙

0

【前端動手玩創意】前端canvas截圖的招式!竟然有三招,可存成SVG或PNG (7)

  • 分享至 

  • xImage
  •  

目錄

【前端動手玩創意】等待的轉圈圈效果 (1)
【前端動手玩創意】google五星評分的星星(2)
【前端動手玩創意】CSS-3D卡片翻轉效果(3) (今天難度頗高,想挑戰再進來!)
【前端動手玩創意】一句CSS做出好看的hero section!(4)
【前端動手玩創意】創造一個Skill bar(5)
【前端動手玩創意】遮蔽廣告(D卡未登入)腳本、自定義新增名單(6)
【前端動手玩創意】前端canvas截圖的招式!竟然有三招,可存成SVG或PNG (7)
【前端動手玩創意】讓你的PDF檔案更難被抓取(8)
【前端動手玩創意】哇操!你敢信?花式寫todo-list,body裡面一行都沒有也能搞?(9)
【前端動手玩創意】卡片製作,才不是!是卡片製作器!(10)

前情提要

想在在JavaScript中,用HTML5的Canvas元素來剪取畫面並存成SVG或PNG。

程式寫法(一)

首先,需要在HTML中創建一個Canvas元素
<canvas id="myCanvas"></canvas>

在JavaScript中,使用canvas.getContext('2d')方法來獲取2D繪圖環境

var canvas = document.getElementById('myCanvas');
var ctx = canvas.getContext('2d');

使用ctx.drawImage()方法將要剪取的圖片繪製到Canvas上

var imageObj = new Image();
imageObj.onload = function() {
  ctx.drawImage(imageObj, 0, 0);
};
imageObj.src = 'example.png';

使用canvas.toDataURL()方法將Canvas轉換成SVG或PNG格式的圖片

// 轉換為SVG
var svgData = canvas.toDataURL('image/svg+xml');
// 轉換為PNG
var pngData = canvas.toDataURL('image/png');

最後,可以將轉換後的圖片下載或顯示出來

// 下載SVG
var link = document.createElement('a');
link.download = 'image.svg';
link.href = svgData;
link.click();

// 顯示PNG
var pngImg = new Image();
pngImg.src = pngData;
document.body.appendChild(pngImg);

程式寫法(二)

使用html2canvas

這邊介紹一個用CDN的小訣竅,官網沒有寫:

<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>

接下來把要抓取的元素找到,加上id為capture就可以使用JS:

html2canvas(document.querySelector("#capture")).then(canvas => {
    document.body.appendChild(canvas)
});

程式寫法(三)

使用DOM to IMG


<script src="https://unpkg.com/dom-to-image@2.6.0/dist/dom-to-image.min.js"></script>
function captureScreenshot(element) {
  return new Promise((resolve, reject) => {
    domtoimage.toPng(element)
      .then((dataUrl) => {
        resolve(dataUrl);
      })
      .catch((error) => {
        reject(error);
      });
  });
}


//放到頁面上確認有這個畫面
captureScreenshot(document.getElementById('dick')).then((value) => {$('<img>').attr('src',value).appendTo($('body'));

}).catch((error) => {
  console.error(error);
});

這樣會轉成base64然後我用appendTo把他丟到body上面,確認圖片會出來。

心得

以上三招都是實用又簡單的方法哦!(,,・ω・,,)
是不是沒有料到有三招呢,
寫前端不怕你沒招,只怕你看了招數之後還不趕緊去嘗試搞看看!
喜歡這系列記得追蹤、收藏唷!

未來會有更多有趣的API以及小項目的介紹呢!


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
淺水員
iT邦大師 6 級 ‧ 2023-04-24 12:59:30
var svgData = canvas.toDataURL('image/svg+xml');

這個方式我剛剛測試,他產生出來的內容還是 png
只是前面的 mediatype 被改寫成 image/svg+xml 而已
瀏覽器能顯示的話只是因為瀏覽器對一些非正常內容會想辦法顯示而已

看更多先前的回應...收起先前的回應...

謝謝分享

淺水員 iT邦大師 6 級 ‧ 2023-04-26 15:49:35 檢舉

內文建議修一下啦
不管瀏覽器是不是能顯示
他跑出來的東西完全就是 png
(不是內嵌點陣圖的 svg ,而是純粹的 png)

測試範例

<canvas></canvas>
<pre></pre>
<script>
    var cvs = document.querySelector('canvas');
    cvs.width = 200;
    cvs.height = 200;
    var ctx = cvs.getContext('2d');
    ctx.beginPath();
    ctx.moveTo(10,10);
    ctx.lineTo(190, 190);
    ctx.stroke();
    var dataUrl = cvs.toDataURL('image/svg+xml');
    console.log(atob(dataUrl.split('base64,')[1]));
</script>

顯示出
https://ithelp.ithome.com.tw/upload/images/20230426/20112943pTKT6eBZE6.png

如果有研究過 png 格式的話應該看得出來是 png 的內容

不要急好嗎XDDD
我有時間會修,又不是不改

你已經有留言解說我相信查詢到的人
也都能看到你清晰講解的版本
chill一點 真的不用那麼焦慮(๑ • ‿ • ๑ )

淺水員 iT邦大師 6 級 ‧ 2023-04-26 17:30:57 檢舉

抱歉,也許留言時是比較急
但另一方面也是怕先前我沒說得很清楚
有可能讓人以為是「內嵌點陣圖的 SVG」
所以想說補充一下細節

您雖然號稱淺水員,但是很用心分享你的知識,
並不會覺得有什麼不好,
我其實非常很感激唷~~畢竟這方面真的是要大家多交流
論壇大家討論比較活躍  也才能夠促進進步呢(๑•́ ₃ •̀๑)

我要留言

立即登入留言