JS實現(xiàn)圖片元素轉BASE64編碼的簡單示例
這里分享前端實現(xiàn)圖片轉 BASE64 的通用方法,支持縮放、灰度處理。
/**
* 將指定元素對象轉換為 Base64 格式
* @param {HTMLImageElement|String} img - 圖片元素(如通過 document.querySelector 獲取)或者選擇器
* @param {Object} ps - 額外參數(shù)
* @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(`參數(shù) 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)
//灰度處理,一定程度上使得圖片內(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})
如需處理遠程圖片,可以參考上面代碼進行改造。
拓展
廢話不多說,直接上代碼
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個參數(shù),參數(shù)一:圖片類型,參數(shù)二: 圖片質量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)
},片地址看看是否成功

但是,一般我們在做這樣的需求前,處理的圖片肯定不止一張,接下來就要批量處理,但是這個方法是異步,我們要將一個數(shù)組內(nèi)的每個對象的地址都轉成base64,才算真正完成我們的功能。前端一般接收到后端的數(shù)據(jù)一般是這種格式。

但是我們正常使用map函數(shù)遍歷去將圖片地址轉成base64,上代碼:
const newImgOBj = await Promise.all(this.imgOBj.map(async (item) => {
return {
name: item.name,
img: await this.base64(item.img)
}
}))
console.log(newImgOBj)打印一下看結果發(fā)現(xiàn)我們的圖片地址已經(jīng)變成了base64編碼。

最后我們將圖片使用img標簽正常渲染就好了,小知識:瀏覽器在識別同一個一模一樣的圖片地址,瀏覽器只會請求一遍該圖片資源哦。
以上就是JS實現(xiàn)圖片元素轉BASE64編碼的簡單示例的詳細內(nèi)容,更多關于JS圖片轉BASE64的資料請關注腳本之家其它相關文章!
相關文章
javascript 獲取url參數(shù)和script標簽中獲取url參數(shù)函數(shù)代碼
不要在方法中調(diào)用方法,否則可能始終獲取的是最后一個js的文件的參數(shù),要在方法中使用,請先用變量保存,在方法中直接獲取2010-01-01
基于js實現(xiàn)復制內(nèi)容到操作系統(tǒng)粘貼板過程解析
這篇文章主要介紹了基于js實現(xiàn)復制內(nèi)容到操作系統(tǒng)粘貼板過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-10-10

