电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

JavaScript前端實(shí)現(xiàn)壓縮圖片功能

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

為什么要前端來壓縮圖片

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

壓縮效果

JavaScript前端實(shí)現(xiàn)壓縮圖片功能

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

通過原生的input標(biāo)簽?zāi)玫揭蟼鞯膱D片文件 將圖片文件轉(zhuǎn)化成img元素標(biāo)簽 在canvas上壓縮繪制該HTMLImageElement 將canvas繪制的圖像轉(zhuǎn)成blob文件 最后將該blob文件傳到服務(wù)端 完成!

接下來看下詳細(xì)步驟

考慮到文章和步驟的完整性,所以我會把每個(gè)細(xì)節(jié)都寫出來,即使有些東西很基礎(chǔ)。

1. 使用Input標(biāo)簽來獲取圖片文件資源

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

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

點(diǎn)擊控件,觸發(fā)焦點(diǎn),打開文件資源管理器,選中文件并確認(rèn)后,會觸發(fā)change事件,所以可以在change事件的回調(diào)中獲取選中文件,它長這個(gè)樣

JavaScript前端實(shí)現(xiàn)壓縮圖片功能

2. 讀取文件轉(zhuǎn)成img標(biāo)簽元素

拿到圖片文件后,先將其轉(zhuǎn)成HTMLImageElement,也就是普通的img標(biāo)簽,具體要使用 FileReader構(gòu)造函數(shù)。

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

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

轉(zhuǎn)化的HTMLImageElement

JavaScript前端實(shí)現(xiàn)壓縮圖片功能

3. canvas壓縮,核心步驟

拿到轉(zhuǎn)化后的img元素后,先取出該元素的寬高度,這個(gè)寬高度就是實(shí)際圖片文件的寬高度。

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

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

// 最大尺寸限制 const maxWidth = 1000,maxHeihgt = 1000 // 需要壓縮的目標(biāo)尺寸 let targetWidth = originWidth, targetHeight = originHeight // 等比例計(jì)算超過最大限制時(shí)縮放后的圖片尺寸 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)) } }

計(jì)算好將要壓縮的尺寸后,創(chuàng)建canvas實(shí)例,設(shè)置canvas的寬高度為壓縮計(jì)算后的尺寸,并將img繪制到上面

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

4. 轉(zhuǎn)成blob文件

canvas繪制完成后,就可以使用 toBlob來將圖像轉(zhuǎn)成blob文件了,這個(gè)api接受三個(gè)入?yún)?/p>

canvas.toBlob(callback, type, encoderOptions);

回調(diào)函數(shù)中可以得到轉(zhuǎn)化后的blob文件,type為要轉(zhuǎn)成的圖片類型,默認(rèn)png。

encoderOptions為當(dāng)設(shè)置的圖片格式為 image/jpeg 或者 image/webp 時(shí)用來指定圖片展示質(zhì)量。

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

轉(zhuǎn)成的blob長這個(gè)樣子

JavaScript前端實(shí)現(xiàn)壓縮圖片功能

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

完整的代碼實(shí)現(xiàn)

因?yàn)檎麄€(gè)過程中都存在著異步回調(diào)操作,所以我使用了async,實(shí)現(xiàn)異步代碼的同步執(zhí)行

// 壓縮前將file轉(zhuǎn)換成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 壓縮后轉(zhuǎn)換的文件類型 * @param mx 觸發(fā)壓縮的圖片最大寬度限制 * @param mh 觸發(fā)壓縮的圖片最大高度限制 */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 // 目標(biāo)尺寸 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’) })}

大致執(zhí)行過程,具體可根據(jù)需求,自行改動

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))

到此這篇關(guān)于JavaScript前端實(shí)現(xiàn)壓縮圖片功能的文章就介紹到這了,更多相關(guān)JavaScript 壓縮圖片內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 税筹星_灵活用工平台_企业财务顾问_财税法薪综合服务平台 | 南溪在线-南溪招聘找工作、找房子、找对象,南溪综合生活信息门户! | 武汉天安盾电子设备有限公司 - 安盾安检,武汉安检门,武汉安检机,武汉金属探测器,武汉测温安检门,武汉X光行李安检机,武汉防爆罐,武汉车底安全检查,武汉液体探测仪,武汉安检防爆设备 | 压滤机滤板_厢式_隔膜_板框压滤机滤板厂家价格型号材质-大凯环保 | 标准品网_标准品信息网_【中检计量】 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 宁波普瑞思邻苯二甲酸盐检测仪,ROHS2.0检测设备,ROHS2.0测试仪厂家 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 渣土车电机,太阳能跟踪器电机,蜗轮蜗杆减速电机厂家-淄博传强电机 | 对照品_中药对照品_标准品_对照药材_「格利普」高纯中药标准品厂家-成都格利普生物科技有限公司 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 心肺复苏模拟人|医学模型|急救护理模型|医学教学模型上海康人医学仪器设备有限公司 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 密封圈_泛塞封_格莱圈-[东莞市国昊密封圈科技有限公司]专注密封圈定制生产厂家 | 太原装修公司_山西整装家装设计_太原室内装潢软装_肖邦家居 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 四川成都干燥设备_回转筒干燥机_脉冲除尘器_输送设备_热风炉_成都川工星科机电设备有限公司 | 济南玻璃安装_济南玻璃门_济南感应门_济南玻璃隔断_济南玻璃门维修_济南镜片安装_济南肯德基门_济南高隔间-济南凯轩鹏宇玻璃有限公司 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 深圳标识制作公司-标识标牌厂家-深圳广告标识制作-玟璟广告-深圳市玟璟广告有限公司 | 冲击式破碎机-冲击式制砂机-移动碎石机厂家_青州市富康机械有限公司 | 结晶点测定仪-润滑脂滴点测定仪-大连煜烁 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 电梯装饰-北京万达中意电梯装饰有限公司 | 水质传感器_水质监测站_雨量监测站_水文监测站-山东水境传感科技有限公司 | 西点培训学校_法式西点培训班_西点师培训_西点蛋糕培训-广州烘趣西点烘焙培训学院 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 柴油机_柴油发电机_厂家_品牌-江苏卡得城仕发动机有限公司 | wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 仿古瓦,仿古金属瓦,铝瓦,铜瓦,铝合金瓦-西安东申景观艺术工程有限公司 | 磨煤机配件-高铬辊套-高铬衬板-立磨辊套-盐山县宏润电力设备有限公司 | 对夹式止回阀_对夹式蝶形止回阀_对夹式软密封止回阀_超薄型止回阀_不锈钢底阀-温州上炬阀门科技有限公司 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 玻璃瓶厂家_酱菜瓶厂家_饮料瓶厂家_酒瓶厂家_玻璃杯厂家_徐州东明玻璃制品有限公司 | ERP企业管理系统永久免费版_在线ERP系统_OA办公_云版软件官网 | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 |