網站首頁 編程語言 正文
一、具體代碼
1、利用canvas壓縮圖片方法一
// 第一種壓縮圖片方法(圖片base64,圖片類型,壓縮比例,回調函數)
// 圖片類型是指 image/png、image/jpeg、image/webp(僅Chrome支持)
// 該方法對以上三種圖片類型都適用 壓縮結果的圖片base64與原類型相同
// 壓縮結果存在誤差 壓縮比例只能作為范圍參考
function compressImg(base64, type, rate, callback) {
// 聲明一個Image對象
var _img = new Image();
// 將圖片的地址賦予這個Image
_img.src = base64;
// 在圖片加載完成后
_img.onload = function () {
// 創建canvas標簽
var _canvas = document.createElement("canvas");
// 根據壓縮比例設置canvas畫布的寬高屬性
// this 指的是當前Image對象
var w = this.width * rate;
var h = this.height * rate;
_canvas.setAttribute("width", w);
_canvas.setAttribute("height", h);
// 將圖片渲染到canvas畫布上 并設置渲染圖片的寬高與畫布的寬高一致
_canvas.getContext("2d").drawImage(this, 0, 0, w, h);
// 將canvas畫布轉換成對應類型的base64
var base64 = _canvas.toDataURL(type);
// 將結果通過回調函數傳遞給方法的調用者
callback(base64);
};
}
2、利用canvas壓縮圖片方法二
// 第二種壓縮圖片的方法(圖片base64,圖片類型,壓縮比例,回調函數)
// 該方法只能將圖片壓縮為為image/jpeg和image/webp兩種類型的圖片base64
// 壓縮結果存在一定誤差 但比第一種方法更加準確
function compressImg2(base64, rate, callback) {
// 聲明一個Image對象
var _img = new Image();
// 將圖片的地址賦予這個Image
_img.src = base64;
// 在圖片加載完成后
_img.onload = function () {
// 創建canvas標簽
var _canvas = document.createElement("canvas");
// 設置canvas畫布的寬高屬性
// this 指的是當前Image對象
var w = this.width;
var h = this.height;
_canvas.setAttribute("width", w);
_canvas.setAttribute("height", h);
// 將圖片渲染到canvas畫布上 并設置渲染圖片的寬高與畫布的寬高一致
_canvas.getContext("2d").drawImage(this, 0, 0, w, h);
// 將canvas畫布轉換成base64 但第一個參數 轉換后的圖片類型只能為image/jpeg或image/webp
// 根據壓縮比例設置第二個參數圖片質量(范圍0-1)
var base64 = _canvas.toDataURL('image/jpeg',rate);
// 將結果通過回調函數傳遞給方法的調用者
callback(base64);
};
}
3、調用壓縮方法
// 圖片base64
const base64 = 'data:image/****;base64,*****'
console.log('壓縮前的圖片---',base64);
// 獲取圖片的類型
const type =file.type
// 調用壓縮方法一
compressImg(res.data,type,0.6,(res2) => {
console.log('這是第一種方法壓縮0.6倍后的圖片:---',res2)
})
// 調用壓縮方法二
compressImg2(res.data,0.6,(res3) => {
console.log('這是第二種方法壓縮0.6倍后的圖片:---',res3)
})
4、代碼解析
? 這兩種壓縮圖片的方法,是借助于Image
和canvas
實現的,整體區別不大,前半部分都是先將base64
圖片通過src
渲染到一個Image
中,當圖片加載完成,觸發onload
事件后,創建一個canvas
元素。區別主要是后半部分:
? 第一種方法是在創建canvas
元素后,設置其寬高為圖片原來寬高*壓縮比例
,然后將圖片渲染到canvas
元素上,同時設置渲染圖片的寬高與canvas
寬高一致,最后通過toDataURL(type)
將canvas
畫布轉成base64
,參數type設置為原來的圖片類型。其主要原理是通過壓縮寬高來實現壓縮圖片的大小,但壓縮結果誤差較大。
? 第二種方法是在創建canvas
元素后,設置其寬高與圖片原本寬高一致,并將圖片渲染到canvas
元素上,同時設置渲染圖片的寬高與canvas
寬高一致,但是在通過toDataURL()
將canvas
畫布轉成base64
時,第一個參數設置圖片類型為:image/jpeg
或image/webp
,第二個參數設置圖片的質量,范圍是0-1
。其主要原理是改變圖片的質量來實現壓縮圖片的大小,壓縮結果相對準確一些。
5、HTMLCanvasElement.toDataURL([type,encoderOptions])
? 該方法是canvas
元素實例的一個方法,參數有兩個,都是可選參數:type
- 輸出圖片的類型,默認為image/png
類型,常見的類型有:image/png
、image/jpeg、image/webp(僅Chrome支持)
,圖片的分辨率為 96dpi; encoderOptions
- 當第一個參數指定圖片類型為 image/jpeg
或 image/webp
的情況下,可以通過該參數設置輸出圖片的質量,取值區間是0-1
,默認為0.92
,當超出取值區間時,會使用默認值。
? 該方法的返回值是一個包含圖片信息的Data URL,也可以看成圖片的base64字符串。但如果調用該方法的canvas元素的寬或高為0,則返回值為字符串"data:,"
,、
瀏覽器兼容性:
6、相關文檔:
前端FileReader對象實現圖片file文件轉base64
前端將base64圖片轉換成file文件
toDataURL
Data URL
原文鏈接:https://blog.csdn.net/weixin_45092437/article/details/129113469
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-12-28 C++?Boost?Archive超詳細講解_C 語言
- 2023-01-30 delphi?判斷字符串是否為純字母組合的函數_Delphi
- 2023-11-11 Python測網絡連通性、能否訪問某個網絡或者端口號<網絡檢測、ping主機、測試端口>
- 2022-12-01 Linux利用inotify和rsync服務實現數據實時同步的原理解析_Linux
- 2022-03-25 Postman如何導出接口的幾種方法(postman怎么把接口導出來)
- 2022-08-25 Python并行編程多線程鎖機制Lock與RLock實現線程同步_python
- 2022-05-23 Android實現類似iOS分欄控制器_Android
- 2022-08-29 Python軟件包安裝的三種常見方法_python
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支