vue使用html2canvas截圖下載時,存在svg或者img時截圖不全的解決辦法

使用html2canvas進行div截圖時,存在svg和img的解決辦法

  • 寫在前面:
  • vue使用html2canvas截圖時,存在svg或者img時截圖時空白,或者不全
    • 解決辦法如下
    • 第一步,svg或者img先轉base64
    • 第二步,將轉換后的base64設置為新元素的content屬性:
    • 第三步,實現div的截圖下載

寫在前面:

1.網上html2canvas資料少,即使你復制拿來用了,也發現各種問題是不是?
2.它的官網也沒有好的demo,不好解決我們的問題。
3.我自己研究了兩天,自創絕招,搞定了它。

以下不廢話:

vue使用html2canvas截圖時,存在svg或者img時截圖時空白,或者不全

當然再導入canvas,通過img轉canvas去替換原來的子節點,再使用html2canvas導出圖片。對于組件層級不多的頁面是可用的。

 const changeToCanvas = async (element) => {const imgElems = element.querySelectorAll('img')let svgelems = [...imgElems]svgelems.forEach((node) => {let parentNode = node.parentNodelet canvas = document.createElement('canvas')canvas.style.zIndex = 999//處理img轉換canvasif (node.tagName == 'IMG') {canvas.width = node.widthcanvas.height = node.heightcanvas.getContext('2d').drawImage(node, 0, 0)parentNode.removeChild(node)let index = parentNode.firstChildif (index != null) {parentNode.insertBefore(canvas, index)} else {parentNode.appendChild(canvas)}}})}

但是如果你組件層級多時,你會發現這種辦法不是很好用,容易出現各種意想不到的問題。

如果你的原元素是svg,那么思路是,遍歷div內的svg,把svg轉圖片,遍歷圖片轉canvas再用html2canvas截圖,如果你這么做了成功了,圖片沒有缺失。那么恭喜你,因為大多數都會存在各種問題。

解決辦法如下

第一步,svg或者img先轉base64

這里我推薦兩個網站,可以將你的svg或img轉base64

https://www.chahuo.com/svg2css.html#google_vignettehttps://www.bejson.com/image/imgzoom/#google_vignette

第二步,將轉換后的base64設置為新元素的content屬性:

如下,用新的div的css的content屬性代替原來的svg或者img。這樣就不需要canvas,只用html2canvas就能實現截圖下載。

::v-deep(.vxe-icon-square-minus) {pointer-events: none;&::before {content: url('data:image/svg+xml;base64,PHN2ZyB0PSIxNzE3NDMyMzMzNDEzIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ4OTAyIiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiPjxwYXRoIGQ9Ik0xMDI0IDB2MTAyNEgwVjBoMTAyNHogbS03OC43NjkyMzEgNzguNzY5MjMxSDc4Ljc2OTIzMXY4NjYuNDYxNTM4aDg2Ni40NjE1MzhWNzguNzY5MjMxeiIgZmlsbD0iIzhhOGE4YSIgcC1pZD0iNDg5MDMiPjwvcGF0aD48cGF0aCBkPSJNNzg3LjY5MjMwOCA0NzIuNjE1Mzg1djc4Ljc2OTIzSDIzNi4zMDc2OTJWNDcyLjYxNTM4NXoiIGZpbGw9IiM4YThhOGEiIHAtaWQ9IjQ4OTA0Ij48L3BhdGg+PC9zdmc+');background-repeat: no-repeat;background-position: center;width: 1em;height: 1em;display: inline-block;}
}::v-deep(.vxe-icon-square-plus) {pointer-events: none;&::before {content: url('data:image/svg+xml;base64,PHN2ZyB0PSIxNzE3NDMyMTAyODAwIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ0MzgwIiB3aWR0aD0iMTQiIGhlaWdodD0iMTQiPjxwYXRoIGQ9Ik0xMDI0IDB2MTAyNEgwVjBoMTAyNHogbS03OC43NjkyMzEgNzguNzY5MjMxSDc4Ljc2OTIzMXY4NjYuNDYxNTM4aDg2Ni40NjE1MzhWNzguNzY5MjMxeiIgZmlsbD0iIzhhOGE4YSIgcC1pZD0iNDQzODEiPjwvcGF0aD48cGF0aCBkPSJNNzg3LjY5MjMwOCA0NzIuNjE1Mzg1djc4Ljc2OTIzSDIzNi4zMDc2OTJWNDcyLjYxNTM4NXoiIGZpbGw9IiM4YThhOGEiIHAtaWQ9IjQ0MzgyIj48L3BhdGg+PHBhdGggZD0iTTQ3Mi42MTUzODUgMjM2LjMwNzY5Mmg3OC43NjkyM3Y1NTEuMzg0NjE2SDQ3Mi42MTUzODV6IiBmaWxsPSIjOGE4YThhIiBwLWlkPSI0NDM4MyI+PC9wYXRoPjwvc3ZnPg==');background-repeat: no-repeat;background-position: center;width: 1em;height: 1em;display: inline-block;}
}
::v-deep(.icon_cri_1) {&::before {content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAA1dJREFUOE9tlE1oXFUUx3/n3TdvPjL5nCQFE7uQSt1owU/iplUxiIpgQVBKoVS7ERQFoZuiaBe1guhCRHHhQty4qOnWhRVawYoKbjTBJB0nE+tk8tF8zsx7994jb8gMIfY+Lu8+zr2/9z/3nvsXdpuqyu6w8+6GOoM98XROAOhu97ILSAMhENU342lENkCWBaz36gVtIe2nCdJS/Eghl/2hGPIxYIFWBxTArd51Bl5q7CTnxUg1NOGKKpEqO0HApmp7wQi4XmfVhaEZ7MvItUzCF2T4patoC4afOfF97YWXJ1Dv0yxUZF+WYgU8+LxWyhu8dWrkp4Fw60xEcbqraBV6jr52c/30cyWG+xpIGIIYxLcIwjy1jTRzRbBk1fFrBd45ma8PN1uP5HK5SgdkPrm82qoVi8HRQxG4bVIthgjxMT2FPMubYBVsIGQSy+xKqJXZqn54+s5iZ4/S3Zf3L8eJDbfl0bsHsXgKoVDMQT50mABaNqThYWEtJrIt5mue3ytGPzheHBgaYidV1Aa9O3UzCXb65OH7s21Q6Dz5wDM6FBHi2dyGfzeaNIICGRtz45+Y65UtvXBivHSwn60u6NzXVZu4LE88NEycNEANxjU5ON6P84pNlMpSA+MNLrBaXlB+vlHnszfvGu6DW13Q2S8XbGwjJidGSGwTNKBUiqgvNTGSp3/QsbzSxPhQrSTMlS3X51f46vVDY4UCte6pvfFp2cYuy+RECSVG1eC9JwgCvPOIqDrnUxBWYubKjh9n6vrNe/fc0QP1jiJe/WjeNq3Is8fGUdeCQPAWcsWCVqqrjA4WSdy2SBIpxvHXfJOrfy7ppYv3HuiFlW5Bnrkwa3dcIk8/NkY+I6hEXLkyS3UpAFNEG1WeP36fGlUJMzHVxUi/+21OL507Mtrby2oHxMm3p+1WojJ57LAslueYmbEauz6SIMaSELqIjMbksuvy5FMPMPXttDaLCVMXjxwownIX9OLZP5LNxARJM9Gs5MEY8UGCoIqmChUllNBGWF1DMv20smv/B71y/trV2mbpQWNzAWpEJYWk6w0qgYo68YEV8VlBbErH+b/jzy88fngsz2L7Vu6xkvQ79ZiO39zOk9J42tJCNrtzm/tBez1sv8G1/3kbk2tbxX8hiskPouecRAAAAABJRU5ErkJggg==');background-repeat: no-repeat;background-position: center;width: 1em;height: 1em;margin-right: 5px;margin-top: 3px;display: inline-block;}
}
::v-deep(.icon_cri) {&::before {content: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAzhJREFUOE+FlN1rHGUUxp9z3pn9SHbdmE26TY0Qml6oV0mk0HpTEUQRrZZCaymI4K03/if+AQq90CL4hVVvctEbqai9EIxSKxFqLcY0O/kwye7OvO85R96JW7cUcWAYmDnzm+c85zlD+J/DzOi/SojIhs/KotHid67vvHvrzsbrOVUBAxxCeR0ejD5SpPb80swzJ+caX8XXI3AURCu/7p5evp1/EtIG9a0CgMDQkmEWaWQ5O9TV40hDszeWqkcAhBI0qubytY28Od1MxaUQc6DgUbgEKgY1MxFFbgzyipxSnUP23IuL7asPgD64vhXqE01ujon54E0kQWLGv+2mGHACFjWTKAFQZZ1H98zLx6e+iIrv8+j9b7ohbU3S47NkYyIWrfydE/phVTlnBsQggZADpgJbqGVnX3my/VkJGmmNLn+b+azWptRr6e+uY9RDgVwIhVLpkwXBPtVMATvRyM6dWWp/+gDova83/DaIXliYKhqGUMC8MBVRmZmxN3K9cYQPr0p7R52dmto5f3axFUH3zI4t0qXvtov1MBG9LGfl1SMoI8QQiAFSgISxhxQmYi/N7r16eqH18aiiCOK3l9fyrH6YvMbGGEGAJPSxjzr6BAoCS33AwBxEAp56ePPCm093Phoq4i2geffW1qU/q61nB4xqUHBtjOzGTaUftx1BDWnYx6mF2l61zpWYUGJIax+vPVodXJubHs+i2QzA7eY4urJRfL/Vr6RigqCBwYxmK5UAoFoBsvXgAsdIeA1KmGvquZOzlS/vKYp9dNE79PNa5eZaP3GqcZplNNTEojsEIi7vmDo2ZnHAfEPOn5hxn8e64fhd1kfnl679dLuvNTPzRDA1CIw9gWIckohTwFVUqkSO5luDC4sz9Zijf0FrAzxy566u3BhwDVbGqFxVOlizg4UDODhQTYwckx6dwMXjh3BlFMTdXq+T+cpjf2wWVwjmY1AJxBZFECT2ZjAOxFKXsFegunz4ofStJ6bRu2/8O0CrB7jxGKG/Dj4fL02DWQtx9+OaaTwZoByQWDOL+J+BDD2i9XXUO52yBdrcRKIHWxIHR5OTQLcbMwj9p8ZWV2HHjpWwWKd/A63m4Ba1UDJpAAAAAElFTkSuQmCC');background-repeat: no-repeat;background-position: center;width: 1em;height: 1em;margin-right: 5px;display: inline-block;margin-top: 3px;}
}

第三步,實現div的截圖下載

一:html2canvas npm

npm install html2canvas@1.4.1  

二:引入

import html2canvas from 'html2canvas'

三:實現

   // 生成圖片const creatImg = async () => {try {const setup = {useCORS: true, // 使用跨域backgroundColor: null,allowTaint: true,logging: true, // 打印日志來檢查是否有加載問題background: '#ffffff', // 一定要添加背景顏色,否則出來的圖片,背景全部都是透明的async: true, // 是否異步解析和呈現元素scale: 2, // 處理模糊問題// dpi: 1000 // 處理模糊問題scrollY: 0, // html2canvas默認繪制視圖內的頁面,需要把scrollY,scrollX設置為0scrollX: 0,ignoreElements: (element) => {//過濾不需要截圖的元素return element.className === 'vxe-tree--btn-wrapper'}}const $image = divImage.value.childNodes[0].childNodes[1]await html2canvas($image, setup).then((canvasimg) => {const link = canvasimg.toDataURL('image/png')const fileName = 'CRI_History_Image_' + getDate()exportPicture(link, fileName)})} catch (e) {console.log(e)}}// 導出圖片const exportPicture = (link, name) => {try {const file = document.createElement('a')file.style.display = 'none'file.download = decodeURI(name)let blob = dataURLtoBlob(link)let url = URL.createObjectURL(blob)file.href = urldocument.body.appendChild(file)file.click()document.body.removeChild(file)} catch (e) {console.log(e)}}const dataURLtoBlob = (dataurl) => {var arr = dataurl.split(',')var mime = arr[0].match(/:(.*?);/)[1]var bstr = atob(arr[1])var n = bstr.lengthvar u8arr = new Uint8Array(n)while (n--) {u8arr[n] = bstr.charCodeAt(n)}return new Blob([u8arr], { type: mime })}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/22275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/22275.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/22275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電源小白入門學習10——浪涌、防浪涌器件、浪涌保護芯片

浪涌、防浪涌器件、浪涌保護芯片 浪涌浪涌保護器件的分類與原理保險絲TVS二極管新防護電路 浪涌 浪涌,相信不少學習過電子的同學或多或少都通過這個詞,但是到底什么是浪涌呢,GPT給我的答案是這樣的: 浪涌,也稱為瞬態…

【雜記-IDS入侵檢測系統、IPS入侵防御系統】

一、IDS概述、分類 IDS概述 IDS,intrusion detection system,入侵檢測系統,其對網絡傳輸進行即時監視,在發現可疑傳輸時發出警報或者采取主動反應措施的網絡安全設備,是一種積極主動的安全防護技術。與防火墻不同的是…

【深度學習】【機器學習】支持向量機,網絡入侵檢測,KDD數據集

文章目錄 環境加載數據歸一化數據訓練模型用測試數據集給出評估指標準確率召回率預測某個輸入數據隨便取一行數據加載訓練好的SVM支持向量機模型并預測 全部數據和代碼下載 環境 之前介紹過用深度學習做入侵檢測,這篇用向量機。 環境Python3.10 requirements.txt…

【miniconda】安裝miniconda

☆ 問題描述 ubuntu環境下安裝miniconda ★ 解決方案 ubuntu環境下安裝miniconda 下載miniconda 包 miniconda官網地址:https://docs.conda.io/en/latest/miniconda.html 清華大學鏡像地址: https://mirrors.tuna.tsinghua.edu.cn/anaconda/minicon…

超級加速器鏈接促進會(UALink)能否打破英偉達的壟斷?

近年來,人工智能(AI)技術的飛速發展催生了對高性能計算和數據中心互聯技術的巨大需求。然而,隨著市場的集中化,英偉達憑借其專有的NVLink和InfiniBand技術,幾乎壟斷了這一市場。這種局面引起了其他科技巨頭…

Python的空格之謎:深度剖析空格在Python編程中的重要作用

Python的空格之謎:深度剖析空格在Python編程中的重要作用 在Python的世界里,空格并不僅僅是一個簡單的空白字符,它承載著編程語法和邏輯的重要使命。對于初學者來說,Python的空格規則可能是一個令人困惑的難題,但一旦…

MFC實現子控件focus焦點上下移動父控件ListView和Gridview也跟著向上下移動

項目中要實現mfc功能,然后子空間焦點下移,LIstView和Gridview父空間不會下移,所以就有這個文章。廢話不多說直接上代碼。 MFCGridView.java import android.content.Context; import android.util.AttributeSet; import android.view.View;…

白酒:產地的釀酒歷史與文化遺產

云倉酒莊豪邁白酒作為中國釀酒工藝的品牌之一,其產地的釀酒歷史與文化遺產具有深遠的意義和價值。產地釀酒歷史悠久,代代相傳的釀酒技藝和與眾不同的文化傳統,構成了云倉酒莊豪邁白酒與眾不同的品質和風味。 據云倉酒莊豪邁介紹,中…

力扣----輪轉數組

題目鏈接:189. 輪轉數組 - 力扣(LeetCode) 思路一 我們可以在進行每次輪轉的時候,先將數組的最后一個數據的值存儲起來,接著將數組中前n-1個數據依次向后移,最后將存儲起來的值賦給數組中的第一個數據。 …

Pixi繪制地圖和小車

之前已經用Pixi繪制出了各種圖形以及通過圖片繪制精靈,這節用pixi繪制網格地圖,并通過圖片制作一個Sprite,讓這個Sprite在網格地圖上運動。首先需要在頁面中添加一個div用來后期展示canvas的畫布,并將此div實例化為PIXI的Applicat…

python繪制雙變量熱力等級圖

參考資料: https://github.com/mikhailsirenko/bivariate-choropleth/blob/main/bivariate-choropleth.ipynb Bivariate choropleth map using Plotly Matplotlib雙變量熱力等級圖 代碼: import pandas as pd import geopandas as gpd import numpy a…

企業轉型必上的監控系統智能管家大屏UI前端開發

企業轉型必上的監控系統智能管家大屏UI前端開發

Istio安裝記錄

環境介紹 我使用的是k8s 1.23.3版本 istio使用的是istio-1.13.3-linux-amd64.tar.gz 把文件下載k8s集群下,解壓 tar -vzxf istio-1.13.3-linux-amd64.tar.gz然后設置環境變量 [rootmaster istio]# cat /etc/profile export ISTIO_HOME/root/istio-1.13.3 expor…

3067. 在帶權樹網絡中統計可連接服務器對數目 Medium

給你一棵無根帶權樹,樹中總共有 n 個節點,分別表示 n 個服務器,服務器從 0 到 n - 1 編號。同時給你一個數組 edges ,其中 edges[i] [ai, bi, weighti] 表示節點 ai 和 bi 之間有一條雙向邊,邊的權值為 weighti 。再給…

Yolo-v5模型訓練速度,與GeForce的AI算力描述

1.GeForce RTX3070 Ti官網參數: GeForce RTXTM 3070 Ti 和 RTX 3070 顯卡采用第 2 代 NVIDIA RTX 架構 - NVIDIA Ampere 架構。該系列產品搭載專用的第 2 代 RT Core ,第 3 代 Tensor Core、全新的 SM 多單元流處理器以及高速顯存,助您在高性…

【網絡安全的神秘世界】MySQL

🌝博客主頁:泥菩薩 💖專欄:Linux探索之旅 | 網絡安全的神秘世界 | 專接本 MySQL MySQL 教程 | 菜鳥教程 (runoob.com) 什么是數據庫 數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫 在do…

二手筆記本怎么買

用途: 1.給爹媽用來簡單辦公,只是用office基礎辦公軟件,無出差無游戲無畫圖需求。 預算: 1000以內 以下是電腦對比選項: 屏幕大小-> 目前市面上的尺寸對比,以A4紙說明,13.3寸14.1寸15.6…

Camunda 7.x 系列【66】實戰篇之我發起的

有道無術,術尚可求,有術無道,止于術。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源碼地址:https://gitee.com/pearl-organization/camunda-study-demo 前后端基于若依:https://gitee.com/y_project/RuoYi-Vue 流程設計器基于RuoYi-flowable:https://gi…

參數高效微調PEFT(四)快速入門(IA)3

參數高效微調PEFT(四)快速入門(IA)3 我們已經了解了HuggingFace中peft庫的幾種高效微調方法。 參數高效微調PEFT(一)快速入門BitFit、Prompt Tuning、Prefix Tuning 參數高效微調PEFT(二)快速入門P-Tuning、P-Tuning V2 參數高效微調PEFT(三)快速入門LoRA、AdaLoRA 今天我…

探索 Omost:創新的圖像生成AI框架

文章目錄 探索 Omost:創新的圖像生成AI框架第一部分:背景第二部分:Omost是什么?第三部分:如何安裝Omost?第四部分:結合具體場景使用第五部分:總結 探索 Omost:創新的圖像…