日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

JavaScript前端實現壓縮圖片功能

瀏覽:214日期:2023-11-08 16:53:03

為什么要前端來壓縮圖片

最近在做一個移動端h5上傳圖片的功能,本來這個功能并不復雜,只需要將圖片文件通過axios傳到服務端即可,但是考慮到現在手機設配的拍照功能十分強大,隨便一張照片都能動輒五六兆,而服務端的要求是上傳圖片必須小于兩兆,而且直接傳這么大圖片,帶寬它也受不了,所以前端進行壓縮圖片就成了一個必要的環節。

壓縮效果

JavaScript前端實現壓縮圖片功能

首先介紹下壓縮的大概流程

通過原生的input標簽拿到要上傳的圖片文件 將圖片文件轉化成img元素標簽 在canvas上壓縮繪制該HTMLImageElement 將canvas繪制的圖像轉成blob文件 最后將該blob文件傳到服務端 完成!

接下來看下詳細步驟

考慮到文章和步驟的完整性,所以我會把每個細節都寫出來,即使有些東西很基礎。

1. 使用Input標簽來獲取圖片文件資源

這一步大家應該最熟悉不過了吧,原生input標簽,通過設置 type 屬性為file來讓用戶可以選擇文件,設置 accept 限制選擇的文件類型,綁定onchange事件,來獲取確認選擇后的文件

<input type='file' accept='image/*' />

點擊控件,觸發焦點,打開文件資源管理器,選中文件并確認后,會觸發change事件,所以可以在change事件的回調中獲取選中文件,它長這個樣

JavaScript前端實現壓縮圖片功能

2. 讀取文件轉成img標簽元素

拿到圖片文件后,先將其轉成HTMLImageElement,也就是普通的img標簽,具體要使用 FileReader構造函數。

先new出來一個img和fileReader的實例,通過fileReader的 readAsDataURL這個api,來讀取圖片文件,其返回值是一個編碼后的base64的字符串,然后將這個字符串賦值給img的src屬性上,這樣就完成了圖片文件到 HTMLImageElement的轉化。

// 先new一個img和fileReader的實例const img = new Image()const reader = new FileReader()// 讀取文件資源reader.readAsDataURL(file) reader.onload = function(e){ img.src = e.target.result}

轉化的HTMLImageElement

JavaScript前端實現壓縮圖片功能

3. canvas壓縮,核心步驟

拿到轉化后的img元素后,先取出該元素的寬高度,這個寬高度就是實際圖片文件的寬高度。

const { width: originWidth, height: originHeight } = img

然后定義一個最大限度的寬高度,如果超過這個限制寬高度,則進行等比例的縮放

// 最大尺寸限制 const maxWidth = 1000,maxHeihgt = 1000 // 需要壓縮的目標尺寸 let targetWidth = originWidth, targetHeight = originHeight // 等比例計算超過最大限制時縮放后的圖片尺寸 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > 1) { // 寬圖片 targetWidth = maxWidth targetHeight = Math.round(maxWidth * (originHeight / originWidth)) } else { // 高圖片 targetHeight = maxHeight targetWidth = Math.round(maxHeight * (originWidth / originHeight)) } }

計算好將要壓縮的尺寸后,創建canvas實例,設置canvas的寬高度為壓縮計算后的尺寸,并將img繪制到上面

// 創建畫布const canvas = document.createElement(’canvas’)const context = canvas.getContext(’2d’)// 設置寬高度為等同于要壓縮圖片的尺寸 canvas.width = targetWidth canvas.height = targetHeight context.clearRect(0, 0, targetWidth, targetHeight) //將img繪制到畫布上 context.drawImage(img, 0, 0, targetWidth, targetHeight)

4. 轉成blob文件

canvas繪制完成后,就可以使用 toBlob來將圖像轉成blob文件了,這個api接受三個入參

canvas.toBlob(callback, type, encoderOptions);

回調函數中可以得到轉化后的blob文件,type為要轉成的圖片類型,默認png。

encoderOptions為當設置的圖片格式為 image/jpeg 或者 image/webp 時用來指定圖片展示質量。

所以如果我們只是要壓縮jpg或者webp格式的圖片的話,不需要進行第3部的操作,直接使用這個api,然后填入想要的質量參數就可以了。但實際上,我們還是要考慮多種的圖片格式,因此很有必要使用第三部的過程。

轉成的blob長這個樣子

JavaScript前端實現壓縮圖片功能

5. 將blob上傳,大功告成。

完整的代碼實現

因為整個過程中都存在著異步回調操作,所以我使用了async,實現異步代碼的同步執行

// 壓縮前將file轉換成img對象function readImg(file) { return new Promise((resolve, reject) => { const img = new Image() const reader = new FileReader() reader.onload = function(e) { img.src = e.target.result } reader.onerror = function(e) { reject(e) } reader.readAsDataURL(file) img.onload = function() { resolve(img) } img.onerror = function(e) { reject(e) } })}

/** * 壓縮圖片 *@param img 被壓縮的img對象 * @param type 壓縮后轉換的文件類型 * @param mx 觸發壓縮的圖片最大寬度限制 * @param mh 觸發壓縮的圖片最大高度限制 */function compressImg(img, type, mx, mh) { return new Promise((resolve, reject) => { const canvas = document.createElement(’canvas’) const context = canvas.getContext(’2d’) const { width: originWidth, height: originHeight } = img // 最大尺寸限制 const maxWidth = mx const maxHeight = mh // 目標尺寸 let targetWidth = originWidth let targetHeight = originHeight if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > 1) { // 寬圖片 targetWidth = maxWidth targetHeight = Math.round(maxWidth * (originHeight / originWidth)) } else { // 高圖片 targetHeight = maxHeight targetWidth = Math.round(maxHeight * (originWidth / originHeight)) } } canvas.width = targetWidth canvas.height = targetHeight context.clearRect(0, 0, targetWidth, targetHeight) // 圖片繪制 context.drawImage(img, 0, 0, targetWidth, targetHeight) canvas.toBlob(function(blob) { resolve(blob) }, type || ’image/png’) })}

大致執行過程,具體可根據需求,自行改動

async function upload(file){ const img = await readImg(file) const blob = await compressImg(img, file.type, 1000, 1000) const formData = new FormData() formData.append(’file’, blob, ’xxx.jpg’) axios.post(’http://xxx.com/api’,formData)}upload(file).catch(e => console.log(e))

到此這篇關于JavaScript前端實現壓縮圖片功能的文章就介紹到這了,更多相關JavaScript 壓縮圖片內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产成人精品免费视| 91亚洲成人| 在线综合视频| 欧美另类综合| 欧美日韩在线播放视频| 国产亚洲电影| 久久精品99国产国产精| 国产精品嫩模av在线| 国产福利一区二区三区在线播放| 久久国产三级| 日韩va亚洲va欧美va久久| 欧美gv在线| 青青青免费在线视频| av综合电影网站| 亚洲网站视频| 丝袜诱惑制服诱惑色一区在线观看 | 999久久久亚洲| 日韩精品一区二区三区免费观影 | 精品丝袜在线| 久久视频精品| 国产精品chinese| 丁香婷婷久久| 久久一区二区三区电影| 国产精品亚洲综合在线观看| 国产免费av一区二区三区| 成人日韩精品| 蜜桃成人av| 免费在线看一区| 欧美+日本+国产+在线a∨观看| 国产精品香蕉| 亚洲另类av| 青青草精品视频| 国产成人精品一区二区三区视频| 国产毛片一区二区三区| 久久在线91| 91精品精品| 欧美国产小视频| 久久亚洲在线| 青青草伊人久久| 中文一区一区三区免费在线观| 97欧美在线视频| 欧美+日本+国产+在线a∨观看| 日韩中文影院| 久久国产精品99国产| 国产精品黄色| 成人av二区| 99久久夜色精品国产亚洲1000部| 精品久久亚洲| 欧美福利在线| 国产精品chinese| 午夜国产精品视频免费体验区| 成人片免费看| 免费视频最近日韩| 久久精品国产久精国产| 99久久www免费| 日韩中文字幕视频网| 日韩av自拍| 亚州欧美在线| 91精品一区国产高清在线gif| 丝袜美腿诱惑一区二区三区| 亚洲欧美不卡| 麻豆成人综合网| 9国产精品视频| 精品少妇av| 综合国产在线| 婷婷成人在线| 久久av资源| 亚洲综合激情在线| 免费在线小视频| 国产精品一区二区三区四区在线观看| 国产三级一区| 亚洲夜间福利| 荡女精品导航| 日本成人一区二区| 激情综合在线| 精品不卡一区| 日产欧产美韩系列久久99| 九九精品调教| 激情久久一区二区| 日韩美女国产精品| 国产精品丝袜在线播放| 欧美91精品| 91综合网人人| 午夜久久av| 久久香蕉国产| 国产中文在线播放| 国产精品欧美日韩一区| 亚洲三级网站| 91久久在线| 国产v日韩v欧美v| 久久高清精品| 国产美女久久| 国产精品久久久久av电视剧| 日韩精品免费视频一区二区三区 | 色爱综合网欧美| 亚洲成人二区| 精品久久精品| 国产乱码精品一区二区亚洲| caoporn视频在线| 国产精品高清一区二区| 色综合视频一区二区三区日韩 | 精品美女在线视频| 久久久久久久久99精品大| 国产中文字幕一区二区三区| 欧美三级精品| 福利在线免费视频| 国产精品多人| 欧美三级第一页| 日韩av中文字幕一区二区| 中文字幕视频精品一区二区三区 | 精品国产亚洲日本| 国产精品三p一区二区| 日本午夜精品| 日韩精品一区二区三区中文字幕| 国产精品伦理久久久久久| 欧美在线首页| 日本特黄久久久高潮| 日韩一区二区三区免费视频| 老鸭窝亚洲一区二区三区| 婷婷综合亚洲| 欧洲激情综合| 99日韩精品| 鲁大师成人一区二区三区| 国产精品夜夜夜| 成人小电影网站| 岛国av在线网站| 色婷婷久久久| 99久久激情| 日本欧美在线看| 老司机精品久久| 精品国产一区二区三区av片| 欧美三区不卡| 久久中文字幕一区二区| 四季av一区二区凹凸精品| 蜜臀av国产精品久久久久| 91精品尤物| 久久精品毛片| www在线观看黄色| 99国产精品免费视频观看| 久久三级福利| 亚洲深夜福利| 亚洲欧美一级| 国产毛片久久久| 久久天堂影院| 日本精品在线中文字幕| 精品欧美久久| 蜜臀av一区二区在线免费观看| 四季av一区二区凹凸精品| 免费在线亚洲| 精品在线网站观看| 国产传媒在线观看| 国内精品福利| 国产一二在线播放| 欧美日韩国产一区二区三区不卡| 国产一区二区三区成人欧美日韩在线观看| 99视频一区| 久久久久一区| 亚洲欧美视频| 国产精品中文| 性感美女一区二区在线观看| 亚洲免费在线| 久久的色偷偷| 久久中文视频| 国产亚洲一区二区手机在线观看 | 久久亚州av| 婷婷成人综合| 日本91福利区| 日韩中文字幕无砖| 久久国产成人| 欧美精品影院| 麻豆精品蜜桃| 日韩国产欧美三级| 国产精品yjizz视频网| 性欧美长视频| 日本少妇精品亚洲第一区| 四虎国产精品免费观看| 国产精品亚洲二区| 啪啪国产精品| 亚洲精品麻豆| 国产色播av在线| 亚洲人成网站在线在线观看| 国产中文字幕一区二区三区| 久久性天堂网| 日本一区二区免费高清| 一区二区国产在线观看| 日韩在线成人| 亚洲区国产区| 日韩88av| 最近国产精品视频| 日韩av在线播放网址| 在线看片一区| 日本一区二区高清不卡| 免费视频久久| 色欧美自拍视频| 日韩毛片网站| 激情久久久久久| 久久99青青| 伊人www22综合色| 久久久9色精品国产一区二区三区| 香蕉成人av|