鞏義網(wǎng)站建設(shè)托管seo詞庫(kù)排行
前端可以使用canvas和File?API來(lái)對(duì)圖片進(jìn)行壓縮和縮放處理,以下是一個(gè)示例代碼 :
- 壓縮方法compressImg這段代碼是實(shí)現(xiàn)對(duì)圖片進(jìn)行上傳前的壓縮功能
1. 定義了一個(gè)壓縮圖片的函數(shù) `compressImg`,接受兩個(gè)參數(shù):`file`表示要壓縮的文件,`quality`表示壓縮的質(zhì)量,取值范圍為0~1之間。
2. 創(chuàng)建了一個(gè) Promise 對(duì)象,將壓縮后的圖片信息作為 Promise 的返回值。
3. 創(chuàng)建了一個(gè) FileReader 對(duì)象 `reader`,用于讀取文件數(shù)據(jù)。
4. 通過(guò) `reader.onload` 事件回調(diào)函數(shù),當(dāng)文件加載完成后觸發(fā)。
5. 在回調(diào)函數(shù)中,創(chuàng)建了一個(gè) Image 對(duì)象 `image`,用于加載圖片。
6. 使用 `image.onload` 事件回調(diào)函數(shù),在圖片加載完成后觸發(fā)。
7. 在 `image.onload` 回調(diào)函數(shù)中,創(chuàng)建了一個(gè) Canvas 對(duì)象 `canvas`,用于繪制圖像。
8. 根據(jù)給定的最大寬高,通過(guò)計(jì)算縮放后的寬高,將圖片等比例縮放到合適的尺寸,設(shè)置了 `canvas` 的寬度和高度,并使用 `drawImage` 方法將原圖繪制在 `canvas` 上。
9. 使用 `canvas.toDataURL()` 將 `canvas` 中的圖像轉(zhuǎn)換為 base64 編碼的DataURL格式的圖像數(shù)據(jù),并指定圖片格式為 `image/jpeg`,質(zhì)量為 `quality`。
10. 將 base64 編碼的數(shù)據(jù)URL 轉(zhuǎn)為二進(jìn)制數(shù)據(jù),并創(chuàng)建一個(gè) Uint8Array 對(duì)象 `bufferArray`。
11. 使用循環(huán)將 base64 編碼的數(shù)據(jù)填充到 `bufferArray` 中。
12. 創(chuàng)建一個(gè)新的 File 對(duì)象 `miniFile`,將 `bufferArray` 作為文件內(nèi)容,文件名與原文件一致,文件類(lèi)型為 `image/jpeg`。
13. 將壓縮前后的圖片信息以對(duì)象的形式返回,并調(diào)用 `resolve` 方法將該對(duì)象作為 Promise 的結(jié)果。
- 壓縮方法compressImg的調(diào)用
1. 通過(guò)監(jiān)聽(tīng)文件選擇框的change事件,在文件選擇后將選擇的圖片文件傳入compressImg函數(shù)中進(jìn)行處理
14. 在成功的回調(diào)中創(chuàng)建一個(gè)新的img對(duì)象,并將newFile.afterSrc賦給其src屬性,這樣就能在頁(yè)面上顯示壓縮后的圖像。此時(shí)對(duì)壓縮后的newFile上傳即可。
<!DOCTYPE html>
<html><head><title>Image Compression Demo</title><style>#output {margin-top: 20px;}</style></head><body><input type="file" id="input" accept="image/*" /><div id="output"></div><script>/*** 壓縮方法* @param {string} file 文件* @param {Number} quality 0~1之間,quality與文件大小成正比*/function compressImg(file, quality) {return new Promise((resolve) => {// 創(chuàng)建 FileReaderconst reader = new FileReader();reader.onload = ({ target: { result: src } }) => {// 創(chuàng)建 img 元素const image = new Image();image.onload = async () => {// 計(jì)算縮放后的寬高var maxWidth = 500;var maxHeight = 500;var width = image.width;var height = image.height;if (width > height) {if (width > maxWidth) {height *= maxWidth / width;width = maxWidth;}} else {if (height > maxHeight) {width *= maxHeight / height;height = maxHeight;}}// 創(chuàng)建 canvas 元素const canvas = document.createElement("canvas");// 設(shè)置canvas的寬高canvas.width = width;canvas.height = height;// 繪制縮放后的canvas圖像canvas.getContext("2d").drawImage(image, 0, 0, width, height);// 將canvas轉(zhuǎn)換為DataURL格式的圖像const canvasURL = canvas.toDataURL(`image/jpeg`, quality);//atob() 對(duì)經(jīng)過(guò) base-64 編碼的字符串進(jìn)行解碼const buffer = atob(canvasURL.split(",")[1]);let length = buffer.length;// ArrayBuffer 對(duì)象用來(lái)表示通用的、固定長(zhǎng)度的原始二進(jìn)制數(shù)據(jù)緩沖區(qū)// Uint8Array 數(shù)組類(lèi)型表示一個(gè) 8 位無(wú)符號(hào)整型數(shù)組,創(chuàng)建時(shí)內(nèi)容被初始化為 0。創(chuàng)建完后,可以以對(duì)象的方式或使用數(shù)組下標(biāo)索引的方式引用數(shù)組中的元素。const bufferArray = new Uint8Array(new ArrayBuffer(length));while (length--) {bufferArray[length] = buffer.charCodeAt(length);}const miniFile = new File([bufferArray], file.name, {type: "image/jpeg",});resolve({file: miniFile,origin: file,beforeSrc: src,afterSrc: canvasURL,beforeKB: Number((file.size / 1024).toFixed(2)),afterKB: Number((miniFile.size / 1024).toFixed(2)),});};image.src = src;};reader.readAsDataURL(file);});}var input = document.getElementById("input");input.addEventListener("change", function (event) {var file = event.target.files[0];compressImg(file, 0.5).then((newFile) => {console.log("newFile", newFile); // 將新的newFile上傳即可var newImg = new Image(); // 創(chuàng)建新的圖像對(duì)象newImg.src = newFile.afterSrc;// 在頁(yè)面上顯示縮放后的圖像var output = document.getElementById("output");output.innerHTML = "";output.appendChild(newImg);});});</script></body>
</html>