1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > vue下使用html2canvas和canvas2image实现海报 保存图片 生成图片的功能

vue下使用html2canvas和canvas2image实现海报 保存图片 生成图片的功能

时间:2023-05-27 20:54:03

相关推荐

vue下使用html2canvas和canvas2image实现海报 保存图片 生成图片的功能

1)安装html2canvas

npm install html2canvas --save

2) 下载Canvas2Image.js,我这里下载好了,直接复制使用即可

/*** covert canvas to image* and save the image file*/var Canvas2Image = function () {// check if support sth.var $support = function () {var canvas = document.createElement('canvas'),ctx = canvas.getContext('2d');return {canvas: !!ctx,imageData: !!ctx.getImageData,dataURL: !!canvas.toDataURL,btoa: !!window.btoa};}();var downloadMime = 'image/octet-stream';function scaleCanvas (canvas, width, height) {var w = canvas.width,h = canvas.height;if (width == undefined) {width = w;}if (height == undefined) {height = h;}var retCanvas = document.createElement('canvas');var retCtx = retCanvas.getContext('2d');retCanvas.width = width;retCanvas.height = height;retCtx.drawImage(canvas, 0, 0, w, h, 0, 0, width, height);return retCanvas;}function getDataURL (canvas, type, width, height) {canvas = scaleCanvas(canvas, width, height);return canvas.toDataURL(type);}function saveFile (strData) {document.location.href = strData;}function genImage(strData) {var img = document.createElement('img');img.src = strData;return img;}function fixType (type) {type = type.toLowerCase().replace(/jpg/i, 'jpeg');var r = type.match(/png|jpeg|bmp|gif/)[0];return 'image/' + r;}function encodeData (data) {if (!window.btoa) { throw 'btoa undefined' }var str = '';if (typeof data == 'string') {str = data;} else {for (var i = 0; i < data.length; i ++) {str += String.fromCharCode(data[i]);}}return btoa(str);}function getImageData (canvas) {var w = canvas.width,h = canvas.height;return canvas.getContext('2d').getImageData(0, 0, w, h);}function makeURI (strData, type) {return 'data:' + type + ';base64,' + strData;}/*** create bitmap image* 按照规则生成图片响应头和响应体*/var genBitmapImage = function (oData) {//// BITMAPFILEHEADER: /en-us/library/windows/desktop/dd183374(v=vs.85).aspx// BITMAPINFOHEADER: /en-us/library/dd183376.aspx//var biWidth = oData.width;var biHeight= oData.height;var biSizeImage = biWidth * biHeight * 3;var bfSize = biSizeImage + 54; // total header size = 54 bytes//// typedef struct tagBITMAPFILEHEADER {// WORD bfType;// DWORD bfSize;// WORD bfReserved1;// WORD bfReserved2;// DWORD bfOffBits;// } BITMAPFILEHEADER;//var BITMAPFILEHEADER = [// WORD bfType -- The file type signature; must be "BM"0x42, 0x4D,// DWORD bfSize -- The size, in bytes, of the bitmap filebfSize & 0xff, bfSize >> 8 & 0xff, bfSize >> 16 & 0xff, bfSize >> 24 & 0xff,// WORD bfReserved1 -- Reserved; must be zero0, 0,// WORD bfReserved2 -- Reserved; must be zero0, 0,// DWORD bfOffBits -- The offset, in bytes, from the beginning of the BITMAPFILEHEADER structure to the bitmap bits.54, 0, 0, 0];//// typedef struct tagBITMAPINFOHEADER {// DWORD biSize;// LONG biWidth;// LONG biHeight;// WORD biPlanes;// WORD biBitCount;// DWORD biCompression;// DWORD biSizeImage;// LONG biXPelsPerMeter;// LONG biYPelsPerMeter;// DWORD biClrUsed;// DWORD biClrImportant;// } BITMAPINFOHEADER, *PBITMAPINFOHEADER;//var BITMAPINFOHEADER = [// DWORD biSize -- The number of bytes required by the structure40, 0, 0, 0,// LONG biWidth -- The width of the bitmap, in pixelsbiWidth & 0xff, biWidth >> 8 & 0xff, biWidth >> 16 & 0xff, biWidth >> 24 & 0xff,// LONG biHeight -- The height of the bitmap, in pixelsbiHeight & 0xff, biHeight >> 8 & 0xff, biHeight >> 16 & 0xff, biHeight >> 24 & 0xff,// WORD biPlanes -- The number of planes for the target device. This value must be set to 11, 0,// WORD biBitCount -- The number of bits-per-pixel, 24 bits-per-pixel -- the bitmap// has a maximum of 2^24 colors (16777216, Truecolor)24, 0,// DWORD biCompression -- The type of compression, BI_RGB (code 0) -- uncompressed0, 0, 0, 0,// DWORD biSizeImage -- The size, in bytes, of the image. This may be set to zero for BI_RGB bitmapsbiSizeImage & 0xff, biSizeImage >> 8 & 0xff, biSizeImage >> 16 & 0xff, biSizeImage >> 24 & 0xff,// LONG biXPelsPerMeter, unused0,0,0,0,// LONG biYPelsPerMeter, unused0,0,0,0,// DWORD biClrUsed, the number of color indexes of palette, unused0,0,0,0,// DWORD biClrImportant, unused0,0,0,0];var iPadding = (4 - ((biWidth * 3) % 4)) % 4;var aImgData = oData.data;var strPixelData = '';var biWidth4 = biWidth<<2;var y = biHeight;var fromCharCode = String.fromCharCode;do {var iOffsetY = biWidth4*(y-1);var strPixelRow = '';for (var x = 0; x < biWidth; x++) {var iOffsetX = x<<2;strPixelRow += fromCharCode(aImgData[iOffsetY+iOffsetX+2]) +fromCharCode(aImgData[iOffsetY+iOffsetX+1]) +fromCharCode(aImgData[iOffsetY+iOffsetX]);}for (var c = 0; c < iPadding; c++) {strPixelRow += String.fromCharCode(0);}strPixelData += strPixelRow;} while (--y);var strEncoded = encodeData(BITMAPFILEHEADER.concat(BITMAPINFOHEADER)) + encodeData(strPixelData);return strEncoded;};/*** saveAsImage* @param canvasElement* @param {String} image type* @param {Number} [optional] png width* @param {Number} [optional] png height*/var saveAsImage = function (canvas, width, height, type) {if ($support.canvas && $support.dataURL) {if (typeof canvas == "string") { canvas = document.getElementById(canvas); }if (type == undefined) { type = 'png'; }type = fixType(type);if (/bmp/.test(type)) {var data = getImageData(scaleCanvas(canvas, width, height));var strData = genBitmapImage(data);saveFile(makeURI(strData, downloadMime));} else {var strData = getDataURL(canvas, type, width, height);saveFile(strData.replace(type, downloadMime));}}};var convertToImage = function (canvas, width, height, type) {if ($support.canvas && $support.dataURL) {if (typeof canvas == "string") { canvas = document.getElementById(canvas); }if (type == undefined) { type = 'png'; }type = fixType(type);if (/bmp/.test(type)) {var data = getImageData(scaleCanvas(canvas, width, height));var strData = genBitmapImage(data);return genImage(makeURI(strData, 'image/bmp'));} else {var strData = getDataURL(canvas, type, width, height);return genImage(strData);}}};return {saveAsImage: saveAsImage,saveAsPNG: function (canvas, width, height) {return saveAsImage(canvas, width, height, 'png');},saveAsJPEG: function (canvas, width, height) {return saveAsImage(canvas, width, height, 'jpeg');},saveAsGIF: function (canvas, width, height) {return saveAsImage(canvas, width, height, 'gif');},saveAsBMP: function (canvas, width, height) {return saveAsImage(canvas, width, height, 'bmp');},convertToImage: convertToImage,convertToPNG: function (canvas, width, height) {return convertToImage(canvas, width, height, 'png');},convertToJPEG: function (canvas, width, height) {return convertToImage(canvas, width, height, 'jpeg');},convertToGIF: function (canvas, width, height) {return convertToImage(canvas, width, height, 'gif');},convertToBMP: function (canvas, width, height) {return convertToImage(canvas, width, height, 'bmp');}};}();export default Canvas2Image;

3) 在需要的组件里面引入

<script>import html2canvas from 'html2canvas';import Canvas2Image from '../assets/js/canvas2image'</script>

4)正式使用,下面为js代码

<div class="about" ref="contain">这是要生成的为图片的内容</div>

createImg:function(){var opts = {useCORS: true,//支持图片跨域allowTaint: false,//这个属性和useCORS不能同时为true哦logging: false,letterRendering: true,};html2canvas(this.$refs.contain,opts)//传入你想生成图片的dom.then(function(canvas) { //Canvas2Image是将canvas转换成图片哦var img = Canvas2Image.convertToImage(canvas,canvas.width,canvas.height);img.style.width="100%";img.style.height="100%";document.getElementById("about-wrapper").appendChild(img);});},

在需要触发的时候调用就可以了

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。