JS實(shí)現(xiàn)圖片元素轉(zhuǎn)BASE64編碼的簡(jiǎn)單示例
這里分享前端實(shí)現(xiàn)圖片轉(zhuǎn) BASE64 的通用方法,支持縮放
、灰度處理
。
/** * 將指定元素對(duì)象轉(zhuǎn)換為 Base64 格式 * @param {HTMLImageElement|String} img - 圖片元素(如通過(guò) document.querySelector 獲?。┗蛘哌x擇器 * @param {Object} ps - 額外參數(shù) * @param {Number} ps.scale - 縮放,默認(rèn) 1 * @param {Boolean} ps.withGray - 是否進(jìn)行灰度處理,默認(rèn) true * @param {String} ps.format - 圖片格式,默認(rèn) image/jpeg * @param {Boolean} ps.natural - 是否使用圖片元素的原始尺寸,默認(rèn) 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(`參數(shù) img 必須是一個(gè)有效的 HTMLImageElement 對(duì)象或選擇器`) 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) //灰度處理,一定程度上使得圖片內(nèi)字符更加清晰 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})
如需處理遠(yuǎn)程圖片,可以參考上面代碼進(jìn)行改造。
拓展
廢話不多說(shuō),直接上代碼
base64 (url) { return new Promise((resolve) => { const image = new Image() // 先設(shè)置圖片跨域?qū)傩? image.crossOrigin = 'Anonymous' // 再給image賦值src屬性,先后順序不能顛倒 image.src = url image.onload = function () { const canvas = document.createElement('CANVAS') // 設(shè)置canvas寬高等于圖片實(shí)際寬高 canvas.width = image.width canvas.height = image.height canvas.getContext('2d').drawImage(image, 0, 0) // toDataUrl可以接收2個(gè)參數(shù),參數(shù)一:圖片類(lèi)型,參數(shù)二: 圖片質(zhì)量0-1(不傳默認(rèn)為0.92) const dataURL = canvas.toDataURL('image/jpeg') resolve(dataURL) } image.onerror = () => { resolve({ message: '相片處理失敗' }) } }) },
我們傳入一個(gè)圖
async mounted () { // this.init() const url = await this.base64('https://fuss10.elemecdn.com/a/3f/3302e58f9a181d2509f3dc0fa68b0jpeg.jpeg') console.log(url) },
片地址看看是否成功
但是,一般我們?cè)谧鲞@樣的需求前,處理的圖片肯定不止一張,接下來(lái)就要批量處理,但是這個(gè)方法是異步,我們要將一個(gè)數(shù)組內(nèi)的每個(gè)對(duì)象的地址都轉(zhuǎn)成base64,才算真正完成我們的功能。前端一般接收到后端的數(shù)據(jù)一般是這種格式。
但是我們正常使用map函數(shù)遍歷去將圖片地址轉(zhuǎn)成base64,上代碼:
const newImgOBj = await Promise.all(this.imgOBj.map(async (item) => { return { name: item.name, img: await this.base64(item.img) } })) console.log(newImgOBj)
打印一下看結(jié)果發(fā)現(xiàn)我們的圖片地址已經(jīng)變成了base64編碼。
最后我們將圖片使用img標(biāo)簽正常渲染就好了,小知識(shí):瀏覽器在識(shí)別同一個(gè)一模一樣的圖片地址,瀏覽器只會(huì)請(qǐng)求一遍該圖片資源哦。
以上就是JS實(shí)現(xiàn)圖片元素轉(zhuǎn)BASE64編碼的簡(jiǎn)單示例的詳細(xì)內(nèi)容,更多關(guān)于JS圖片轉(zhuǎn)BASE64的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
javascript 獲取url參數(shù)和script標(biāo)簽中獲取url參數(shù)函數(shù)代碼
不要在方法中調(diào)用方法,否則可能始終獲取的是最后一個(gè)js的文件的參數(shù),要在方法中使用,請(qǐng)先用變量保存,在方法中直接獲取2010-01-01JavaScript中文件緩存導(dǎo)致404錯(cuò)誤的解決方案
當(dāng) JavaScript 文件在服務(wù)器上被更新或刪除后,瀏覽器仍然請(qǐng)求舊的緩存文件,導(dǎo)致 404 錯(cuò)誤,本文將深入探討這一問(wèn)題的原因,并提供多種解決方案,需要的可以參考下2025-03-03layui前端時(shí)間戳轉(zhuǎn)化實(shí)例
今天小編就為大家分享一篇layui前端時(shí)間戳轉(zhuǎn)化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11微信小程序?qū)崿F(xiàn)左右聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)左右聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09基于js實(shí)現(xiàn)復(fù)制內(nèi)容到操作系統(tǒng)粘貼板過(guò)程解析
這篇文章主要介紹了基于js實(shí)現(xiàn)復(fù)制內(nèi)容到操作系統(tǒng)粘貼板過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10js項(xiàng)目中前端如何實(shí)現(xiàn)無(wú)感刷新token
本文主要介紹了js項(xiàng)目中前端如何實(shí)現(xiàn)無(wú)感刷新token,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07