Vue使用html2canvas實現(xiàn)截取圖片并保存
html2canvas 簡介
html2canvas是一個JavaScript庫,它可以將HTML元素轉(zhuǎn)換為Canvas元素。具體來說,它可以將整個頁面或特定的HTML元素轉(zhuǎn)換為一幅圖像,這對于創(chuàng)建屏幕截圖、生成PDF文件或在上創(chuàng)建可編輯的圖像非常有用。
html2canvas 安裝
安裝 html2canvas 很簡單,只需要一個簡單的命令即可。
npm install html2canvas --save
等待命令執(zhí)行完成就可以了。
html2canvas 使用
使用的時候也非常的方便。首先在需要使用的地方進行引入。
import html2canvas from 'html2canvas'
在 Vue 組件中使用 html2canvas 將 HTML 元素轉(zhuǎn)換為 canvas:
methods: {
convertToCanvas() {
const element = this.$refs.element // 獲取要轉(zhuǎn)換的HTML元素
html2canvas(element).then(canvas => {
// 在這里可以對canvas進行操作,例如將其添加到頁面中或保存為圖片等
// 例如:this.$refs.canvasContainer.appendChild(canvas)
})
}
}
在模板中添加要轉(zhuǎn)換的HTML元素和調(diào)用方法的引用:
<template>
<div>
<div ref="element">要轉(zhuǎn)換的HTML元素</div>
<button @click="convertToCanvas">轉(zhuǎn)換為Canvas</button>
<div ref="canvasContainer"></div>
</div>
</template>
當用戶點擊按鈕時,convertToCanvas方法將被調(diào)用,它將獲取要轉(zhuǎn)換的HTML元素并使用html2canvas將其轉(zhuǎn)換為canvas。轉(zhuǎn)換完成后,可以在then回調(diào)函數(shù)中對canvas進行操作,例如將其添加到頁面中或保存為圖片等。
案例:保存縮略圖
之前在項目里面寫過一個功能,就是把頁面保存成縮略圖展示。需要獲取這個頁面的截圖,然后把截圖數(shù)據(jù)發(fā)送給后端,后端保存起來,然后查詢列表的時候后端返回保存的縮略圖進行展示。就是引用上面的步驟:
// 獲取截圖
getPicture() {
html2canvas(this.$refs.panelPage).then(canvas => {
// 獲取生成的圖片的url,并設置為png格式
const imgUrl = canvas.toDataURL("images/png");
let base64Data = imgUrl.split(",")[1];
let binaryData = atob(base64Data);
let uint8Array = new Uint8Array(binaryData.length);
for (let i = 0; i < binaryData.length; i++) {
uint8Array[i] = binaryData.charCodeAt(i);
}
// 獲取blob文件流
let blob = new Blob([uint8Array], { type: "image/png" });
// 文件流轉(zhuǎn)文件
let file = new File([blob], "filename.png", {
type: "image/png",
});
let fd = new FormData()
fd.append('file', file)
// 請求后端數(shù)據(jù)接口
coverUpload(fd)
})
},
上面獲取了截圖之后調(diào)用請求接口的方法就OK了。
這樣就可以把頁面的截圖獲取下來,然后保存縮略圖到后端。但是在實際使用上發(fā)現(xiàn)一個大問題,就是我引用的網(wǎng)絡圖片獲取截取不下來。于是找了一下原因:是因為跨域的問題導致覺得不安全,就沒有截取。
解決這個問題也很簡單,配置一下允許跨域,上面代碼改一下:
// 獲取截圖
getPicture(id) {
html2canvas(this.$refs.panelPage, {
useCORS: true, // 開啟跨域
}).then(canvas => {
// 獲取生成的圖片的url,并設置為png格式
const imgUrl = canvas.toDataURL("images/png");
let base64Data = imgUrl.split(",")[1];
let binaryData = atob(base64Data);
let uint8Array = new Uint8Array(binaryData.length);
for (let i = 0; i < binaryData.length; i++) {
uint8Array[i] = binaryData.charCodeAt(i);
}
// 獲取blob文件流
let blob = new Blob([uint8Array], { type: "image/png" });
// 文件流轉(zhuǎn)文件
let file = new File([blob], "filename.png", {
type: "image/png",
});
let fd = new FormData()
fd.append('file', file)
// 請求后端數(shù)據(jù)接口
coverUpload(id, fd)
})
},
主要就是這一句代碼:useCORS: true。
但是發(fā)現(xiàn)有些還不行,為啥呢,因為他需要服務端開啟跨域 response.setHeader("Access-Control-Allow-Origin","*") ;。如果是自己的服務器的話,那改一下 nginx 的代理配置就可以了。
location /imgSource/ {
# 加上這三行就可以了
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
autoindex on;
alias C:/Users/11466/Desktop/serve/classe/image/;
}
這樣就能截取下來了,反正我是成功了。
到此這篇關于Vue使用html2canvas實現(xiàn)截取圖片并保存的文章就介紹到這了,更多相關Vue html2canvas截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
VueX學習之modules和namespacedVueX詳細教程
這篇文章主要為大家介紹了VueX學習之modules和namespacedVueX詳細教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-06-06
vue的路由守衛(wèi)和keep-alive后生命周期詳解
這篇文章主要為大家詳細介紹了vue路由守衛(wèi)和keep-alive,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03

