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

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

JavaScript前端實現壓縮圖片功能

瀏覽:211日期: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久久,三上悠亚国产精品一区二区三区
欧美激情五月| 午夜免费一区| 国产精品毛片| 亚洲欧美日韩国产| 亚洲精品自拍| 日韩三区四区| 国产精品一二| 黄色欧美在线| 99久久久久久中文字幕一区| 秋霞影视一区二区三区| 亚洲高清av| 日韩精品一区第一页| 午夜精品福利影院| 免费观看亚洲天堂| 日本不良网站在线观看| 免费观看久久av| 午夜宅男久久久| 国产精品久久久免费| 麻豆国产在线| 男女性色大片免费观看一区二区| 欧美日韩精品免费观看视频完整| 免费精品视频最新在线| 国产图片一区| 欧美欧美黄在线二区| 国产成人精品免费视| 日韩视频在线一区二区三区 | 久久精品av麻豆的观看方式| 美女久久久久久 | 日韩和欧美一区二区三区| 国产精品天天看天天狠| 日韩不卡免费高清视频| 日韩精品一区第一页| 激情综合五月| 日韩中文字幕亚洲一区二区va在线 | 精精国产xxxx视频在线野外| 激情欧美一区二区三区| 97久久超碰| 九色porny丨国产首页在线| 亚洲精品少妇| 国模大尺度视频一区二区| 久久久久久久久久久9不雅视频| av最新在线| 91亚洲精品视频在线观看| 九九久久婷婷| 久久影院一区二区三区| 日韩精品一级中文字幕精品视频免费观看 | 久久美女精品| 日韩欧美2区| 99精品综合| 久久亚洲精精品中文字幕| 婷婷综合亚洲| 精品久久91| 亚洲人成毛片在线播放女女| 免费看av不卡| 久久精品99国产精品| 夜夜嗨一区二区| 日韩一区欧美| 精品国内亚洲2022精品成人| 蜜桃视频第一区免费观看| 日韩黄色大片网站| 国产精品一在线观看| 免费看日韩精品| 日韩精品永久网址| 国产日韩欧美三级| 亚洲视频二区| 久久精品中文| 精品国产亚洲一区二区三区| 亚洲综合激情在线| 五月精品视频| 日韩电影在线视频| 麻豆精品在线| 日本不卡中文字幕| 黑丝一区二区三区| 久久久久国产精品一区三寸| 精品中国亚洲| 免费日韩成人| 国产精品片aa在线观看| 最新亚洲国产| 国产一级一区二区| 黄色成人91| 国产综合精品| 欧美日韩在线网站| 激情综合激情| 欧美1区2区3区| 亚洲一级少妇| 视频在线不卡免费观看| 久久精品九色| 国产精品mv在线观看| 日本欧美一区二区| 国产亚洲在线| 野花国产精品入口| 极品裸体白嫩激情啪啪国产精品| 国产精品二区不卡| 高清久久一区| 亚洲黄色网址| 99视频精品视频高清免费| av高清不卡| 久久男女视频| 91国语精品自产拍| 亚洲免费中文| 亚洲影院天堂中文av色| 中文字幕亚洲精品乱码| 在线日韩成人| 深夜福利一区| 国产欧美日韩视频在线| 国产精品红桃| 国产一区二区三区四区五区| 动漫av一区| 久久久久国产精品一区三寸| 99久精品视频在线观看视频| 黄色不卡一区| 欧美.日韩.国产.一区.二区| 99国产精品| 日韩高清成人在线| 精品国产成人| 亚洲欧美伊人| 国产精品久久久久久久久免费高清 | 亚洲成人国产| 中日韩男男gay无套| 视频一区中文字幕国产| 亚洲人成精品久久久| 国产乱码精品| 欧产日产国产精品视频| 在线亚洲欧美| 国产精品一级| 99精品综合| 亚洲香蕉视频| 精品久久久网| 国产一区二区中文| 婷婷亚洲成人| 精品国产一区二区三区2021| 欧美日韩在线观看首页| 国产综合婷婷| 日韩av影院| 狠狠躁少妇一区二区三区| 婷婷综合社区| 国产欧美在线| 欧美日韩中文字幕一区二区三区| 亚洲香蕉久久| 国产夫妻在线| 热久久久久久久| 激情久久99| 中文字幕一区日韩精品| 国产毛片久久久| 欧美91福利在线观看| 日韩二区三区在线观看| 亚洲国产欧美日本视频| 男人操女人的视频在线观看欧美| 国产极品模特精品一二| 91精品99| 久久精品国内一区二区三区| 欧美日韩国产一区精品一区| 国产美女亚洲精品7777| 久久精品国产www456c0m| 日韩精品国产欧美| 久久中文字幕av一区二区不卡| 亚洲精品美女| 日本不卡免费高清视频在线| 久久av在线| av中文字幕在线观看第一页| 在线观看一区| 亚洲天堂资源| 久久国产乱子精品免费女| 在线看片不卡| 97人人精品| 国产欧美一区二区精品久久久 | 蜜臀久久久久久久| 色一区二区三区四区| 日本vs亚洲vs韩国一区三区二区| 亚洲黄色免费看| 国产精品日本一区二区三区在线 | 亚洲精品一区三区三区在线观看| 亚洲精品伦理| 国产亚洲一区二区手机在线观看| 日本中文字幕不卡| 在线亚洲成人| 国产99久久| 亚洲风情在线资源| 国产调教一区二区三区| 视频一区二区欧美| 蜜臀久久99精品久久一区二区| 成人在线免费观看网站| 青青青国产精品| 亚洲精品大全| 久热精品在线| 欧美日韩国产在线观看网站| 国产精品蜜芽在线观看| 欧美黄页在线免费观看| 日韩精选在线| 一本综合精品| 美国三级日本三级久久99| 一区二区视频欧美| 免费视频国产一区| 欧洲亚洲一区二区三区| caoporn视频在线| 久久精品国产99国产| 国产精品毛片久久久| 国产欧美一区二区色老头| 日本91福利区| 天堂va欧美ⅴa亚洲va一国产|