網(wǎng)站首頁 編程語言 正文
一、具體代碼
1、利用canvas壓縮圖片方法一
// 第一種壓縮圖片方法(圖片base64,圖片類型,壓縮比例,回調(diào)函數(shù))
// 圖片類型是指 image/png、image/jpeg、image/webp(僅Chrome支持)
// 該方法對以上三種圖片類型都適用 壓縮結(jié)果的圖片base64與原類型相同
// 壓縮結(jié)果存在誤差 壓縮比例只能作為范圍參考
function compressImg(base64, type, rate, callback) {
// 聲明一個Image對象
var _img = new Image();
// 將圖片的地址賦予這個Image
_img.src = base64;
// 在圖片加載完成后
_img.onload = function () {
// 創(chuàng)建canvas標(biāo)簽
var _canvas = document.createElement("canvas");
// 根據(jù)壓縮比例設(shè)置canvas畫布的寬高屬性
// this 指的是當(dāng)前Image對象
var w = this.width * rate;
var h = this.height * rate;
_canvas.setAttribute("width", w);
_canvas.setAttribute("height", h);
// 將圖片渲染到canvas畫布上 并設(shè)置渲染圖片的寬高與畫布的寬高一致
_canvas.getContext("2d").drawImage(this, 0, 0, w, h);
// 將canvas畫布轉(zhuǎn)換成對應(yīng)類型的base64
var base64 = _canvas.toDataURL(type);
// 將結(jié)果通過回調(diào)函數(shù)傳遞給方法的調(diào)用者
callback(base64);
};
}
2、利用canvas壓縮圖片方法二
// 第二種壓縮圖片的方法(圖片base64,圖片類型,壓縮比例,回調(diào)函數(shù))
// 該方法只能將圖片壓縮為為image/jpeg和image/webp兩種類型的圖片base64
// 壓縮結(jié)果存在一定誤差 但比第一種方法更加準(zhǔn)確
function compressImg2(base64, rate, callback) {
// 聲明一個Image對象
var _img = new Image();
// 將圖片的地址賦予這個Image
_img.src = base64;
// 在圖片加載完成后
_img.onload = function () {
// 創(chuàng)建canvas標(biāo)簽
var _canvas = document.createElement("canvas");
// 設(shè)置canvas畫布的寬高屬性
// this 指的是當(dāng)前Image對象
var w = this.width;
var h = this.height;
_canvas.setAttribute("width", w);
_canvas.setAttribute("height", h);
// 將圖片渲染到canvas畫布上 并設(shè)置渲染圖片的寬高與畫布的寬高一致
_canvas.getContext("2d").drawImage(this, 0, 0, w, h);
// 將canvas畫布轉(zhuǎn)換成base64 但第一個參數(shù) 轉(zhuǎn)換后的圖片類型只能為image/jpeg或image/webp
// 根據(jù)壓縮比例設(shè)置第二個參數(shù)圖片質(zhì)量(范圍0-1)
var base64 = _canvas.toDataURL('image/jpeg',rate);
// 將結(jié)果通過回調(diào)函數(shù)傳遞給方法的調(diào)用者
callback(base64);
};
}
3、調(diào)用壓縮方法
// 圖片base64
const base64 = 'data:image/****;base64,*****'
console.log('壓縮前的圖片---',base64);
// 獲取圖片的類型
const type =file.type
// 調(diào)用壓縮方法一
compressImg(res.data,type,0.6,(res2) => {
console.log('這是第一種方法壓縮0.6倍后的圖片:---',res2)
})
// 調(diào)用壓縮方法二
compressImg2(res.data,0.6,(res3) => {
console.log('這是第二種方法壓縮0.6倍后的圖片:---',res3)
})
4、代碼解析
? 這兩種壓縮圖片的方法,是借助于Image
和canvas
實(shí)現(xiàn)的,整體區(qū)別不大,前半部分都是先將base64
圖片通過src
渲染到一個Image
中,當(dāng)圖片加載完成,觸發(fā)onload
事件后,創(chuàng)建一個canvas
元素。區(qū)別主要是后半部分:
? 第一種方法是在創(chuàng)建canvas
元素后,設(shè)置其寬高為圖片原來寬高*壓縮比例
,然后將圖片渲染到canvas
元素上,同時設(shè)置渲染圖片的寬高與canvas
寬高一致,最后通過toDataURL(type)
將canvas
畫布轉(zhuǎn)成base64
,參數(shù)type設(shè)置為原來的圖片類型。其主要原理是通過壓縮寬高來實(shí)現(xiàn)壓縮圖片的大小,但壓縮結(jié)果誤差較大。
? 第二種方法是在創(chuàng)建canvas
元素后,設(shè)置其寬高與圖片原本寬高一致,并將圖片渲染到canvas
元素上,同時設(shè)置渲染圖片的寬高與canvas
寬高一致,但是在通過toDataURL()
將canvas
畫布轉(zhuǎn)成base64
時,第一個參數(shù)設(shè)置圖片類型為:image/jpeg
或image/webp
,第二個參數(shù)設(shè)置圖片的質(zhì)量,范圍是0-1
。其主要原理是改變圖片的質(zhì)量來實(shí)現(xiàn)壓縮圖片的大小,壓縮結(jié)果相對準(zhǔn)確一些。
5、HTMLCanvasElement.toDataURL([type,encoderOptions])
? 該方法是canvas
元素實(shí)例的一個方法,參數(shù)有兩個,都是可選參數(shù):type
- 輸出圖片的類型,默認(rèn)為image/png
類型,常見的類型有:image/png
、image/jpeg、image/webp(僅Chrome支持)
,圖片的分辨率為 96dpi; encoderOptions
- 當(dāng)?shù)谝粋€參數(shù)指定圖片類型為 image/jpeg
或 image/webp
的情況下,可以通過該參數(shù)設(shè)置輸出圖片的質(zhì)量,取值區(qū)間是0-1
,默認(rèn)為0.92
,當(dāng)超出取值區(qū)間時,會使用默認(rèn)值。
? 該方法的返回值是一個包含圖片信息的Data URL,也可以看成圖片的base64字符串。但如果調(diào)用該方法的canvas元素的寬或高為0,則返回值為字符串"data:,"
,、
瀏覽器兼容性:
6、相關(guān)文檔:
前端FileReader對象實(shí)現(xiàn)圖片file文件轉(zhuǎn)base64
前端將base64圖片轉(zhuǎn)換成file文件
toDataURL
Data URL
原文鏈接:https://blog.csdn.net/weixin_45092437/article/details/129113469
- 上一篇:沒有了
- 下一篇:沒有了
相關(guān)推薦
- 2023-01-19 Go定時器的三種實(shí)現(xiàn)方式示例詳解_Golang
- 2023-04-17 Python使用future處理并發(fā)問題方案詳解_python
- 2022-06-01 Vertica集成Apache?Hudi重磅使用指南_相關(guān)技巧
- 2022-07-16 借助Redis的過期機(jī)制和分布式鎖實(shí)現(xiàn)定時任務(wù)
- 2023-03-23 Python?eval()與exec()函數(shù)使用介紹_python
- 2022-07-17 Android?studio實(shí)現(xiàn)簡單計算器的編寫_Android
- 2022-04-15 python中對正則表達(dá)式re包的簡單引用方式_python
- 2022-10-30 Python利用Pandas進(jìn)行數(shù)據(jù)分析的方法詳解_python
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支