利用 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
- ??圖片壓縮CanvasCanvas
- canvas 壓縮圖片Canvas
- 利用 canvas 實現資料壓縮Canvas
- JNI實現圖片壓縮
- 前端的圖片壓縮image-compressor(可在圖片上傳前實現圖片壓縮)前端
- layui中實現上傳圖片壓縮UI
- 圖片純前端JS壓縮的實現前端JS
- web前端實現圖片壓縮處理Web前端
- 利用Java實現zip壓縮/解壓縮 (轉)Java
- Java 實現壓縮圖片,影片,音訊案例Java音訊
- html canvas 圖片壓縮後 透明背景變成黑色HTMLCanvas
- canvas實現的圖片縮放程式碼例項Canvas
- canvas實現的前端壓縮裁剪工具Canvas前端
- 利用javascript實現圖片等比例縮放JavaScript
- 前端圖片壓縮 - H5&Uni-App圖片壓縮前端H5APP
- IOS圖片壓縮iOS
- 圖片壓縮怎樣操作?分享幾種實用的批次圖片壓縮技巧
- Flutter實現Luban圖片壓縮庫演算法Flutter演算法
- java使用google開源工具實現圖片壓縮JavaGo開源工具
- 純前端實現 PNG 圖片壓縮 | UPNG.js前端JS
- Nginx網路壓縮 CSS壓縮 圖片壓縮 JSON壓縮NginxCSSJSON
- 圖片壓縮不求人,3個親測實用高效的圖片壓縮神器
- JAVA基礎:利用Java實現zip壓縮解壓縮(轉)Java
- 圖片壓縮知識梳理(0) 圖片壓縮學習計劃
- web前端之HTML5壓縮圖片compress image with canvasWeb前端HTMLCanvas
- Android圖片壓縮實現過程及程式碼Android
- canvas實現圖片馬賽克Canvas
- iOS 圖片壓縮方法iOS
- 前端圖片壓縮方案前端
- 實現圖片縮放
- android圖片壓縮不失真實戰Android
- JavaScript實現手機拍攝圖片的旋轉、壓縮JavaScript
- SmallImage for Mac(圖片壓縮工具)Mac
- js上傳圖片壓縮JS
- js圖片壓縮推薦JS
- android下圖片壓縮Android
- java後臺壓縮圖片Java