美文网首页
2020-05-23 前端图片压缩

2020-05-23 前端图片压缩

作者: FConfidence | 来源:发表于2020-05-23 13:50 被阅读0次

前端完成图片压缩

流程

  1. 通过原生的input标签拿到要上传的图片文件
  2. 将图片文件转化成img元素标签
  3. 在canvas上压缩绘制该HTMLImageElement
  4. 将canvas绘制的图像转成blob文件
  5. 最后将该blob文件传到服务端

1. 使用Input标签来获取图片文件资源

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

2. 读取文件转成img标签元素

// 先new一个img和fileReader的实例
const img = new Image()
const reader = new FileReader()// 读取文件资源
reader.readAsDataURL(file)

reader.onload = function(e) {
  img.src = e.target.result
}

3. canvas压缩,核心步骤

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(callback, type, encoderOptions);

5. 将blob上传,大功告成


// 压缩前将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))

相关文章

  • 2020-05-23 前端图片压缩

    前端完成图片压缩 流程 通过原生的input标签拿到要上传的图片文件 将图片文件转化成img元素标签 在canva...

  • 前端实现图片裁剪和压缩

    前端实现图片的裁剪和压缩1、压缩图片drawImage,压缩图片长宽或者质量参数来实现压缩 2、图片base64转...

  • 前端使用canvas对图片进行压缩

    纯前端对图片压缩 纯前端因为可以调用FileReader和canvas接口,在图片压缩方面非常便捷.思路就是获取图...

  • 前端图片压缩

    参考网址http://blog.csdn.net/tkg09/article/details/68947082ht...

  • 21天习惯养成打卡-day1

    遇到的问题 前端进行图片压缩 bootstrap框架表单的使用 解决方法 张鑫旭博客上的解决方案前端实现图片压缩上...

  • 前端性能优化方式

    2.前端性能优化方式 减少http请求。 大量图片渲染使用懒加载技术,图片压缩。 压缩代码,将javascript...

  • 前端自动化工具|gulp新手入门

    gulp是前端自动化工具,它可以进行html压缩、css压缩合并、js检查压缩、图片压缩、编译less、编译...

  • 图片压缩上传

    参考1-HTML5实现图片压缩上传功能参考2-移动前端—图片压缩上传实践参考3-移动端H5图片压缩上传 大体步骤 ...

  • HTML5 file API加canvas实现图片前端JS压缩并

    一、图片上传前端压缩的现实意义 对于大尺寸图片的上传,在前端进行压缩除了省流量外,最大的意义是极大的提高了用户体验...

  • 一次基于electron的图片上传插件的开发过程

    背景: 项目前端有个图片压缩包上传功能,用户上传的时候会选择单反拍摄的巨幅图片,由于前端打不开压缩包,也没法读取压...

网友评论

      本文标题:2020-05-23 前端图片压缩

      本文链接:https://www.haomeiwen.com/subject/bygkahtx.html