利用 canvas 實現圖片壓縮
專案中做身份證識別時,需要傳送圖片的 base64 格式編碼,但是手機拍攝的照片都太大了,轉成 base64 簡直可怕,因此找了一下解決辦法
涉及到的知識點
-
input
標籤的onchange
事件是在上傳完檔案之後觸發 - 當
input
標籤type="file"
時,使用files
屬性獲取到上傳的檔案物件 -
readAsDataURL
用於將讀取內容轉換成base64
編碼 - 區分
canvas
的 畫布 和 繪畫環境:-
畫布:對應程式碼中的
cvs
,可以設定畫布width
,height
; -
繪畫環境:對應程式碼中的
ctx
,由cvs
得來。ctx = cvs.getContext('2d')
,可以設定fillStyle
,fillRect
等;
-
畫布:對應程式碼中的
- 使用
canvas
自帶的drawImage()
方法將上傳的圖片畫到canvas
上 - 想取到壓縮後圖片的
base64
可以使用canvas
自帶的toDataURL()
方法
完整程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<input type="file" onchange="loadImg(this)">
<hr>
<div>800×449,544KB</div>
<img src="" alt="">
<hr>
<div>400×224,157KB</div>
<canvas></canvas>
<script>
// 上傳圖片
function loadImg(me) {
let img = document.querySelector('img');
let cvs = document.querySelector('canvas');
let file = me.files[0]; // 獲取到檔案物件
// 上傳的圖片大於 500KB 時才壓縮
if (file && (file.size / 1024 > 500)) {
let reader = new FileReader();
reader.readAsDataURL(file); // 轉成 base64 編碼
reader.onload = function (e) {
let naturalBase64 = e.target.result; // 獲取 base64 編碼,這是原圖的
img.src = naturalBase64;
img.onload = function () {
let ratio = img.naturalWidth / img.naturalHeight; // 獲取原圖比例,為了等比壓縮
cvs.width = 400;
cvs.height = cvs.width / ratio;
let ctx = cvs.getContext('2d');
ctx.drawImage(img, 0, 0, cvs.width, cvs.height); // 畫在 canvas 上
// 壓縮後新圖的 base64
let zipBase64 = cvs.toDataURL();
}
}
}
}
</script>
</body>
</html>
效果圖
關於壓縮後的圖片大小
-
這裡提供一個開箱即用的方法,
baseStr
是一個 完整的Base64
編碼,就是包括 程式碼:
function calcBase(baseStr){
var tag = 'base64,';
baseStr = baseStr.substring(baseStr.indexOf(tag)+tag.length);
var eqTagIndex = baseStr.indexOf('=');
baseStr = eqTagIndex!=-1?baseStr.substring(0,eqTagIndex):baseStr;
var strLen = baseStr.length;
var fileSize = strLen - (strLen / 8) * 2;
console.log("檔案大小:" + (fileSize / 1024).toFixed(1) + 'KB');
}
相關文章
- 純前端實現 JPG 圖片壓縮 | canvas前端Canvas
- canvas 壓縮圖片Canvas
- ??圖片壓縮CanvasCanvas
- JNI實現圖片壓縮
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- 圖片純前端JS壓縮的實現前端JS
- layui中實現上傳圖片壓縮UI
- html canvas 圖片壓縮後 透明背景變成黑色HTMLCanvas
- Java 實現壓縮圖片,影片,音訊案例Java音訊
- canvas實現的前端壓縮裁剪工具Canvas前端
- 前端圖片壓縮 - H5&Uni-App圖片壓縮前端H5APP
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- 圖片壓縮怎樣操作?分享幾種實用的批次圖片壓縮技巧
- 圖片壓縮20201109
- 純前端實現 PNG 圖片壓縮 | UPNG.js前端JS
- Flutter實現Luban圖片壓縮庫演算法Flutter演算法
- 前端圖片壓縮方案前端
- Photoshop壓縮png圖片
- iOS 圖片壓縮方法iOS
- 觸屏 H5 如何實現壓縮並上傳多張圖片,同時還可以進行圖片壓縮H5
- Vue使用cube-ui的upload元件實現圖片壓縮VueUI元件
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- canvas實現圖片馬賽克Canvas
- SmallImage for Mac(圖片壓縮工具)Mac
- js圖片壓縮推薦JS
- js上傳圖片壓縮JS
- vue 上傳圖片進行壓縮圖片Vue
- 【前端】壓縮圖片以及圖片相關概念前端
- png格式如何壓縮,圖片壓縮工具哪個好
- Python實現壓縮和解壓縮Python
- 怎麼轉換圖片格式並壓縮圖片
- Image Optimizer for Mac(圖片壓縮工具)Mac
- 基於 NSData 的圖片壓縮
- 前端圖片壓縮及上傳前端
- Bitmap的圖片壓縮彙總
- 影像體積壓縮工具JPEG Jackal更好的壓縮圖片
- excel檔案裡的圖片怎麼壓縮?excel檔案裡圖片的壓縮方法Excel
- canvas實現二維碼和圖片合成Canvas