成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

開箱即用的前端圖片壓縮方案

開發 前端
前端實現圖片壓縮無非就是在用戶上傳圖片文件后, 將file?轉換成image對象,然后再利用canvas? 及其 api 將圖片壓縮成指定體積。

前端實現圖片壓縮的背景

我們都知道在“寸土寸金”的互聯網時代,速度是第一競爭力, 雖然我們的5G發展已經搖搖領先, 但是也經不住用戶在一個網頁里傳很多“巨無霸”圖片, 最終導致的結果就是頁面“龜速”打開......

圖片

那么作為技術人, 當然也有一堆的解決方案, 比如:

  • 壓縮圖片再上傳
  • 將圖片上傳到圖床, 利用圖床壓縮能力和CDN節點就近分發
  • 圖片流式加載
  • 圖片懶加載/ 預加載

當然聰明的小伙伴也會將上面的方案組合, 設計更優秀的圖片“提速”方案。

今天不會和大家把所有方案都介紹一遍,因為網上也有很多實踐, 接下來會從前端技術提升的角度, 分享一下如何用原生 javascript, 實現從圖片上傳到圖片自定義壓縮的完整方案,大家可以把文章中介紹的方案直接用于自己的實際開發中,或者基于它設計更棒的圖片壓縮方案。

圖片

實現圖片壓縮的方案

前端實現圖片壓縮無非就是在用戶上傳圖片文件后, 將file?轉換成image對象,然后再利用canvas? 及其 api 將圖片壓縮成指定體積如下流程:

圖片

代碼實現

首先我們先實現將file?轉換成image對象,這里我們用到了FileReader API, 代碼如下:

// 壓縮前將file轉換成img對象
function readImg(file:File) {
return new Promise((resolve, reject) => {
const img = new Image()
const reader = new FileReader()
reader.onload = function(e:any) {
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)
}
})
}

這里使用 promise 來設計生成圖片數據的方法,接下來我們看看核心的圖片壓縮源碼:

/**
* 壓縮圖片
* @param img 被壓縮的img對象
* @param type 壓縮后轉換的文件類型
* @param mx 觸發壓縮的圖片最大寬度限制
* @param mh 觸發壓縮的圖片最大高度限制
* @param quality 圖片質量
*/
function compressImg(img: any, type:string, mx: number, mh: number, quality:number = 1) {
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', quality)
})
}

這里通過控制 canvas?的寬高,以及對 canvas? 的 toBlob設置參數,來實現自定義的圖片壓縮。

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2023-01-15 20:28:32

前端圖片壓縮

2023-11-04 12:43:44

前端圖片參數

2021-08-31 15:53:48

Nuxt 開箱服務

2023-03-08 21:25:58

開源工具庫開箱

2016-11-02 18:43:02

javascripthtml5vue.js

2011-12-14 00:58:38

vStart虛擬化實施DELL

2021-09-26 05:41:47

基礎設施連接無線技術網絡

2021-09-01 17:43:32

StreamNativ開源

2023-01-29 07:49:57

2021-09-28 09:30:18

uni-appVue 3.0uniCloud

2022-08-02 09:01:55

后臺管理模版

2015-06-30 09:49:19

管理平臺開源KVM

2022-01-03 18:15:35

FlaskTepHttpRunner

2013-11-01 09:37:19

Android系統架構工具

2025-05-15 08:35:00

2019-11-25 00:00:00

開源技術 數據

2023-04-04 10:09:09

2022-04-26 09:44:29

算法庫EasyCV開源

2021-04-22 10:28:52

開發技能代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 看片国产 | 精品国产乱码久久久久久丨区2区 | 成人久久久 | 天堂网av在线 | 国产成人啪免费观看软件 | 成人毛片在线观看 | 日本精品在线观看 | 夜夜爆操 | aa级毛片毛片免费观看久 | 久久久久久久久久久久久久久久久久久久 | 久久久久国产 | 久久久久香蕉视频 | 国产日韩欧美一区 | 亚洲一区二区三区免费在线 | 亚洲福利在线观看 | 日日操日日舔 | 久久久久国色av免费观看性色 | 免费在线观看成人av | 国产激情精品视频 | 国产综合精品一区二区三区 | 亚洲人成人一区二区在线观看 | 亚洲一区二区三区 | 婷婷综合网 | 国产精品美女久久久久久免费 | 亚洲精彩视频在线观看 | 色综合一区二区 | 精品国产伦一区二区三区观看体验 | 美女视频黄色的 | 最新中文字幕 | 日本电影韩国电影免费观看 | 欧美一区二区激情三区 | 日韩毛片在线观看 | 久久精品国产一区二区电影 | 成人精品啪啪欧美成 | 亚洲高清视频在线观看 | 久草高清视频 | 欧美成人精品 | 国产三级一区二区 | av影片在线 | 日韩精彩视频 | 美女黄网 |