網頁截圖功能 DOM to image

最近在工作上需要寫網頁截圖的功能,所以稍微研究了一下 dom-to-image 這個插件,在我寫這篇筆記時的版本是 2.15.0。
dom-to-image
npm-dom-to-image

起手式

npm

如果要使用 npm 的方式可以參考以下安裝指令:

npm install dom-to-image

官網範例

**step1 **

node 參數放入要抓取截圖的 DOM 節點,config 的部分放入細部的設定。

<script>
  domtoimage.toPng(node,config)
  //程式碼放的位置
</script>

config` 設定

const config = {
  quality: 1,
  style: { filter: "grayscale(100%)", width: "600px" }
};
  • quality: 設定圖片的品質。
  • style: 可以套用濾鏡,也可以設定圖片的寬度與高度。

step2
後面接非同步程式碼

var node = document.getElementById('my-node');

domtoimage.toPng(node)
    // 非同步程式碼
    .then(function (dataUrl) {
        var img = new Image();
        // 產生圖片的網址
        img.src = dataUrl;
        // 把圖片加入到 body 節點的下方
        document.body.appendChild(img);
    })
    .catch(function (error) {
        console.error('oops, something went wrong!', error);
    });

我在 CodePen 中加入一個按鈕,去監聽 click 事件,觸發 domtoimage ,擷取到 capture1 DOM 元素,轉為圖片, 然後把圖片的網址 append 到按鈕之後的 inserDiv 節點上。

擷取 DOM 元素,下載圖片

接下來加上以下程式碼,就可以做到截取 DOM 元素,轉為圖片之後下載的功能。

// 幫下載的圖片檔案名稱
const filename = "popeye_Demo_" + new Date().getTime();
// 下載的部分
var link = document.createElement("a");
// 下載圖片的檔名
link.download = `${filename}.jpeg`;
link.href = dataUrl;
link.click();

完整 JS 程式碼

var node = document.getElementById("capture1");
// config 參數設定
const config = {
  quality: 1,
  style: { filter: "grayscale(100%)", width: "600px" }
};

const newnode = document.createElement("h2");
const textnode = document.createTextNode("截到的圖");
newnode.appendChild(textnode);

// 觸發按鈕
const btn = document.getElementById("captureBtn");
// 監聽觸發按鈕 domtoimage.toPng(node)
captureBtn.addEventListener("click", (e) => {
  domtoimage
    .toPng(node, config)
    .then(function (dataUrl) {
      var img = new Image();
      img.src = dataUrl;
      const filename = "popeye_Demo_" + new Date().getTime();
      // 下載的部分
      var link = document.createElement("a");
      // 下載圖片的檔名
      link.download = `${filename}.jpeg`;
      link.href = dataUrl;
      link.click();
      // 把截圖插入到指定的位置
      const inserDiv = document.getElementById("insert");
      inserDiv.appendChild(newnode);
      inserDiv.appendChild(img);
    })
    .catch(function (error) {
      console.error("oops, something went wrong!", error);
    });
});

參考資料


網頁截圖功能 DOM to image
https://popeye-ux.github.io/2023/03/17/dom-to-image/
作者
POPEYE
發布於
2023年3月17日
許可協議