JS实现图片元素转BASE64编码的简单示例
这里分享前端实现图片转 BASE64 的通用方法,支持缩放
、灰度处理
。
/** * 将指定元素对象转换为 Base64 格式 * @param {HTMLImageElement|String} img - 图片元素(如通过 document.querySelector 获取)或者选择器 * @param {Object} ps - 额外参数 * @param {Number} ps.scale - 缩放,默认 1 * @param {Boolean} ps.withGray - 是否进行灰度处理,默认 true * @param {String} ps.format - 图片格式,默认 image/jpeg * @param {Boolean} ps.natural - 是否使用图片元素的原始尺寸,默认 true * @returns {String} */ function imgToBase64(img, ps={}) { if(typeof(img)==='string') img = document.querySelector(img) if(Object.prototype.toString.call(img) != '[object HTMLImageElement]') throw Error(`参数 img 必须是一个有效的 HTMLImageElement 对象或选择器`) ps = Object.assign({scale:1.0, withGray:true, format: "image/jpeg", natural:true}, ps) let canvas = document.createElement("canvas") let ctx = canvas.getContext("2d") let width = ps.natural? img.naturalWidth : img.width let height = ps.natural? img.naturalHeight : img.height canvas.width = width * ps.scale canvas.height = height * ps.scale ctx.drawImage(img, 0, 0, width, height, 0, 0, canvas.width, canvas.height) //灰度处理,一定程度上使得图片内字符更加清晰 if (ps.withGray) { let imgD = ctx.getImageData(0, 0, canvas.width, canvas.height) let len = canvas.width * canvas.height * 4 for (let i = 0; i < len; i += 4) { let gray = Math.floor((imgD.data[i] + imgD.data[i + 1] + imgD.data[i + 2]) / 3) imgD.data[i] = imgD.data[i + 1] = imgD.data[i + 2] = gray > 100 ? gray : 0 } ctx.putImageData(imgD, 0, 0) } return canvas.toDataURL(ps.format) }
使用方式
imgToBase64(".logo") // 缩放 0.5 倍 imgToBase64(document.querySelector(".logo"), {scale:0.5})
如需处理远程图片,可以参考上面代码进行改造。
拓展
废话不多说,直接上代码
base64 (url) { return new Promise((resolve) => { const image = new Image() // 先设置图片跨域属性 image.crossOrigin = 'Anonymous' // 再给image赋值src属性,先后顺序不能颠倒 image.src = url image.onload = function () { const canvas = document.createElement('CANVAS') // 设置canvas宽高等于图片实际宽高 canvas.width = image.width canvas.height = image.height canvas.getContext('2d').drawImage(image, 0, 0) // toDataUrl可以接收2个参数,参数一:图片类型,参数二: 图片质量0-1(不传默认为0.92) const dataURL = canvas.toDataURL('image/jpeg') resolve(dataURL) } image.onerror = () => { resolve({ message: '相片处理失败' }) } }) },
我们传入一个图
async mounted () { // this.init() const url = await this.base64('https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg') console.log(url) },
片地址看看是否成功
但是,一般我们在做这样的需求前,处理的图片肯定不止一张,接下来就要批量处理,但是这个方法是异步,我们要将一个数组内的每个对象的地址都转成base64,才算真正完成我们的功能。前端一般接收到后端的数据一般是这种格式。
但是我们正常使用map函数遍历去将图片地址转成base64,上代码:
const newImgOBj = await Promise.all(this.imgOBj.map(async (item) => { return { name: item.name, img: await this.base64(item.img) } })) console.log(newImgOBj)
打印一下看结果发现我们的图片地址已经变成了base64编码。
最后我们将图片使用img标签正常渲染就好了,小知识:浏览器在识别同一个一模一样的图片地址,浏览器只会请求一遍该图片资源哦。
以上就是JS实现图片元素转BASE64编码的简单示例的详细内容,更多关于JS图片转BASE64的资料请关注脚本之家其它相关文章!
相关文章
IE与Firefox在JavaScript上的7个不同句法分享
尽管那需要用长串的、沉闷的不同分支代码来应付不同浏览器的日子已经过去,偶尔还是有必要做一些简单的区分和目标检测来确保某块代码能在用户的机器上正常运行2011-10-10小议Function.apply() 之一------(函数的劫持与对象的复制)
小议Function.apply() 之一------(函数的劫持与对象的复制)...2006-11-11
最新评论