前端的图片压缩image-compressor(可在图片上传前实现图片压缩)

2023-11-03

 

转载自

作者:言墨儿
链接:https://www.jianshu.com/p/3ce3e3865ae2
作者:UYOU
链接:https://www.imooc.com/article/40038
来源:慕课网

image-compressor

一个简单的JavaScript图像压缩器。使用浏览器的原生canvas.toBlob API做的压缩工作。一般使用此压缩是在客户端图像文件上传之前。

实例模板:Website
github:image-compressor

Getting started(新手入门)

Install(npm 安装)

npm install image-compressor.js // 注意是image-compressor.js 不是 image-compressor那是另一个包

Usage(使用)

Syntax语法

new ImageCompressor([file[, options]])

参数说明

file:(可选)压缩的目标图像文件,类型是 File 或者 Blob
options:(可选)压缩选项,类型是 Object

案例

<input type="file" id="file" accept="image/*">
import axios from 'axios'import ImageCompressor from 'image-compressor.js' // 引入document.getElementById('file').addEventListener('change', (e) => {  const file = e.target.files[0]; // file对象
  if (!file) { return } // 为空处理
  new ImageCompressor(file, {    quality: .6,
    success(result) {      const formData = new FormData(); // FormData学习地址 https://developer.mozilla.org/zh-CN/docs/Web/API/FormData
      formData.append('file', result, result.name);      // 通过XMLHttpRequest服务发送压缩的图像文件-Send the compressed image file to server with XMLHttpRequest.
      axios.post('/path/to/upload', formData).then(() => {        console.log('Upload success');
      });
    },
    error(e) {      console.log(e.message);
    },
  });
});

Options参数

checkOrientation

是否检查图片的 orientation 属性,类型是 boolean。默认值是 true。

提示:如果读取图像的EXIF的 orientation 属性(JPEG图像),有可能根据 orientation 属性自动翻转或旋转图像。
注意:不要一直相信这一点,因为一些JPEG图像有不正确的(不是标准的) orientation 属性

maxWidth

输出图像的最大宽度,类型是 number。默认值是 Infinity。值应该大于0。

因为一个canvas元素的大小限制,所以为了避免得到一个空白的输出图像,你可能需要给最大宽度和最大高度选项设置有限的数字。

maxHeight

输出图像的最大高度,类型是 number。默认值是 Infinity。值应该大于0。

minWidth

输出图像的最小宽度,类型是 number。默认值是 0。该值应大于0且不应大于maxWidth

minHeight

输出图像的最小宽度,类型是 number。默认值是 0。该值应大于0且不应大于maxHeight

width

输出图像的宽度,类型是 number。默认值是 undefined。值应该大于0。

如果没有指定,将使用原始图像的自然宽度,或者如果设置高度选项,则宽度将由自然长宽比自动计算。

height

输出图像的高度,类型是 number。默认值是 undefined。值应该大于0。

如果没有指定,将使用原始图像的自然高度,或者如果设置宽度选项,则高度将由自然长宽比自动计算。
注意:为了保持与原始图像相同的宽高比,如果设置宽度选项,将使用它自动计算高度,这意味着高度选项将被忽略。

quality

输出图像的画质,类型是 number。默认值是 undefined。值是0到1之间的数字。

小心使用1,因为它可能使输出图像的尺寸变大。
注意:此选项仅适用于 JPEG 和 WebP 格式的图像。

Examples:

图片原来大小 图片压缩大小 压缩比例 描述
0 2.12MB 114.61 KB 94.72% -
0.2 2.12MB 349.57 KB 83.90% -
0.4 2.12MB 517.10 KB 76.18% -
0.6 2.12MB 694.99 KB 67.99% 推荐
0.8 2.12MB 1.14 MB 46.41% 推荐
1 2.12MB 2.12 MB 0% 不推荐
NaN 2.12MB 2.01 MB 5.02% -

mimeType

输出图像的文件类型,类型是 string。默认值是 auto。默认情况下,源映像文件的原始MIME类型将被使用。

convertSize

输出图像的文件类型,类型是 number。默认值是 5000000 (5MB)。

PNG文件超过此值将被转换为JPEG格式。若要禁用此功能,只需将值设置为无穷大。

Examples (in Chrome 61):

convertSize 输入的文件大小Input size (type) 输出的文件大小Output size (type) 压缩比
5 MB 1.87 MB (PNG) 1.87 MB (PNG) 0%
5 MB 5.66 MB (PNG) 450.24 KB (JPEG) 92.23%
5 MB 9.74 MB (PNG) 883.89 KB (JPEG) 91.14%

beforeDraw(context, canvas)

在将图像绘制到画布中进行压缩之前,要执行的钩子函数,类型是 Function。默认值是 null。
参数说明:

context: canvas的2D渲染上下文。
canvas: 压缩画布

new ImageCompressor(file, {
  beforeDraw(context) {
    context.fillStyle = '#fff';
  },
});

drew(context, canvas)

该钩子函数执行后,将图像绘制到画布中进行压缩,类型是 Function。默认值是 null。
参数说明:

context: canvas的2D渲染上下文。
canvas: 压缩画布

new ImageCompressor(file, {
  drew(context) {
    context.filter = grayscale(100%);
  },
});

success(result)

成功压缩图像时执行的钩子函数,类型是 Function。默认值是 null。
参数说明:

result: 压缩后的图像(一个Blob对象)。

error(err)

当图像压缩失败时执行的钩子函数,类型是 Function。默认值是 null。
参数说明:

err: 压缩错误(一个Error对象)。

方法

compress(file[, options])

file:(必选)压缩的目标图像文件,类型是 File 或者 Blob
options:(可选)压缩选项,类型是 Object
返回值: Promise

使用:

const imageCompressor = new ImageCompressor();

imageCompressor.compress(e.target.files[0], {    quality: 0.8,    maxHeight: 1000,    maxWidth: 1000}).then((result) => { // 压缩成功的回调 Handle the compressed image file.
    const formData = new FormData()
    formData.append('file', result)    // 请求:Send the compressed image file to server with XMLHttpRequest...
    // var xhr = new XMLHttpRequest()
    // xhr.withCredentials = true...}).catch((err) => { // 压缩失败的回调 Handle the error
    console.log(err)
})

浏览器支持

  • Chrome (latest)

  • Firefox (latest)

  • Safari (latest)

  • Opera (latest)

  • Edge (latest)

  • Internet Explorer 10+ (requires a Promise polyfill as es6-promise)

案例

基于vue的element-ui图片上传前的压缩,注意是element-ui的上传组件。

首先:

npm install image-compressor.js

然后:

import ImageCompressor from 'image-compressor.js' // 引入图片压缩

构写代码:

html

<el-upload  :httpRequest="httpRequest"></el-upload>

httpRequest

httpRequest (options) { // 覆盖默认的上传行为,可以自定义上传的实现,解决压缩问题
  if (this.imageCompress && this.acceptName === 'image/*') { // 如果允许压缩,并且当前上传的是图片
    var imageCompressor = new ImageCompressor() // 压缩成功则使用压缩的结果,不成功直接上传
    imageCompressor.compress(options.file, {      quality: 0.8,      maxHeight: 1000,      maxWidth: 1000
    }).then((result) => { // 压缩成功的回调
      options.file = result      console.log(options)      return ajax(options) // 压缩成功把压缩成功的数据传递给ajax.js
    }).catch((err) => { // 压缩失败的回调
      console.log(err)      return options.file // 压缩失败把原文件传递
    })
  } else {    return ajax(options)
  }
}

ajax.js

使用说明:ajax.js可以拿出来单独使用哟!如果需要封装成引用型组件,请自行封装。

function getError (action, option, xhr) {  let msg  if (xhr.response) {
    msg = `${xhr.response.error || xhr.response}`
  } else if (xhr.responseText) {
    msg = `${xhr.responseText}`
  } else {
    msg = `fail to post ${action} ${xhr.status}`
  }  const err = new Error(msg)
  err.status = xhr.status
  err.method = 'post'
  err.url = action  return err
}function getBody (xhr) {  const text = xhr.responseText || xhr.response  if (!text) {    return text
  }  try {    return JSON.parse(text)
  } catch (e) {    return text
  }
}export default function upload (option) {  if (typeof XMLHttpRequest === 'undefined') {    return
  }  const xhr = new XMLHttpRequest()  const action = option.action  if (xhr.upload) {
    xhr.upload.onprogress = function progress (e) {      if (e.total > 0) {
        e.percent = e.loaded / e.total * 100
      }
      option.onProgress(e)
    }
  }  const formData = new FormData()  if (option.data) {    Object.keys(option.data).forEach(key => {
      formData.append(key, option.data[key])
    })
  }

  formData.append(option.filename, option.file)

  xhr.onerror = function error (e) {
    option.onError(e)
  }

  xhr.onload = function onload () {    if (xhr.status < 200 || xhr.status >= 300) {      return option.onError(getError(action, option, xhr))
    }

    option.onSuccess(getBody(xhr))
  }

  xhr.open('post', action, true)  if (option.withCredentials && 'withCredentials' in xhr) {
    xhr.withCredentials = true
  }  const headers = option.headers || {}  for (let item in headers) {    if (headers.hasOwnProperty(item) && headers[item] !== null) {
      xhr.setRequestHeader(item, headers[item])
    }
  }
  xhr.send(formData)  return xhr
}

结语

到此我们学会了使用image-compressor.js进行图片压缩,并且可以根据image-compressor.js在图片上传前实现图片压缩。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前端的图片压缩image-compressor(可在图片上传前实现图片压缩) 的相关文章

随机推荐

  • 计算机毕业设计Node.js+Vue流浪动物救助网站(程序+源码+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • js控制伪元素属性更改

    首先 先简单说一下伪元素都有哪些 伪元素有六个 分别是 after before first line first letter selection backdrop 其中 after和 before是网站用的比较多的 有些场景我们想要通过
  • 嵌入式Linux Qt5 (C++)开发栏目概述

    本栏目开始介绍Linux系统下的Qt C 程序开发 资源是以嵌入式为切入点 现在Linux系统下的Qt C 程序开发好像就是应用于嵌入式 那就跟着一起学习Linux系统下的Qt C 程序开发知识 再扩展一下嵌入式的知识吧 我这里默认已经熟悉
  • LeetCode:动态规划中的股票问题【来和我一起用Python炒股吧~】

    股票问题是动态规划里面非常非常经典的问题了 本文列举了8道经典题目 都给出了详细的分析 可以发现这些题目的思路都是一致的 只是细节不同而已 赶快刷起来 quad PS 本文是参考代码随想录做的一些笔记 完整版本请戳链接 非常好的教程 121
  • 9月计算机二级考后须知 & 下次考试通知

    哈喽 小伙伴们大家好啊 2022年9月计算机等级考试已接近尾声 提前祝参加考试的同学都能顺利上岸 再次预祝参加9月考试的同学锦鲤附体 都是过儿 考完试后 这几件事你还得知道 目录 02 下次考试情况 03 备考12月二级 刷题软件 公众h
  • C++网络编程-高性能服务器编程

    目录 5 linux网络编程基础api 5 1 socket地址api 主机字节序和网络字节序 通用socket地址 专用socket地址 ip转换函数 5 2 创建socket 5 3 命名socket 5 4 监听socket 5 5
  • Eclipse中使用Mybatis自动生成

    插件的安装 Help gt Eclipse Marketpalce 搜索mybatis 选择如下图的插件 一路安装 重启idea 配置文件的生成 new gt file gt other 搜索mybatis 选择如下图文件 运行文件 自动生
  • 【华为OD】

    一 题目描述 某公司研发了一款高性能 AI 处理器 每台物理设备具备 8 颗 AI 处理器 编号分别为 0 1 2 3 4 5 6 7 编号 0 3 的处理器处于同一个链路中 编号 4 7 的处理器处于另外一个链路中 不通链路中的处理器不能
  • 分页---Vue+.net+bootstrap实现

    通过学习Vue 的确觉的Vue的双向绑定使用起来十分方便 因此研究了一下列表显示时分页的实现 这里我使用了bootstrap的样式 所以在页面中引用bootstrap的样式文件 后台提数据源使用 net的 数据库访问使用EF 如果库中存有大
  • SvelteKit 1.0 - 建立个人博客,显示您的 DEV 帖子

    这篇文章的目的是提供最新版本的 SvelteKit 的简要介绍 我们将构建一个开发人员组合和博客网站 从您的 RSS 提要和 GitHub API 中获取数据 内容 SvelteKit 简介 我们要建造什么 让我们开始吧 步骤 0 先决条件
  • seaborn 超全用就完事了

    seaborn Seaborn 01 图控制 01 Seaborn 02 颜色板控制 02 Seaborn 03 数据分布图 03 Seaborn 04 Jointplot两变量图 04 Seaborn 05 Pairplot多变量图 05
  • 大一同学快要期末考试的Python专业课复习 第一章

    第一章 Ptthon 简介 1 1 Python 概述 1 2 搭建 Python 开发环境 1 3 第一个 Python 程序 1 3 1 在IDLE 中编写 Hello World 程序 1 3 2 运行 Python 程序 1 4 P
  • SpringBoot定时任务及分布式锁

    目录 目录 目录 前言 一 定时任务 二 Cron表达式 用短横线 表示时间段 用L表示最后 L是单词Last 最后的 的首字母 Scheduled常用参数的差异 三 分布式锁 分布式锁 项目目中的问题及解决办法 分布式锁的实现 前言 需求
  • 编写测试分析

    编写测试分析的目的 在方向上明确要测什么 怎么测 以及达到什么样质量标准 按照从主到次 从上到下 梳理系统思路 明确测试点 便于对需求的了解和分析 通过编写软件测试分析可间接整理出需求设计的缺陷 提前了解整体测试任务 预测测试风险 测试分析
  • vue项目发布后,webpack源码F12能查看

    正常情况下 webpack 打包的 vue 项目 发布后在浏览器中F12可以直接查看到前端源码 解决这个问题 在 config js 文件中找到 productionSourceMap true 改为 false 如果没有效果 增加 Sou
  • YOLO的训练数据和标注方法是怎样的?如何准备和处理数据集?

    YOLO You Only Look Once 是一种高效的实时目标检测算法 它在训练过程中需要准备适当的数据集和相应的标注 本文将介绍YOLO算法的训练数据和标注方法 以及如何准备和处理数据集 为读者提供一个全面的指南 YOLO的训练数据
  • angular 指令渲染_[Angular 组件库 NG-ZORRO 基础入门] - 待办事项 + 双向绑定

    前言回顾 这几天我们已经完成了 TODO 待办事项 的一些基本功能 涉及多个组件的使用方式 今天我们将 TODO 待办事项 的一些组件独立出来维护 介绍一些组件设计的小方法后 我们将对这个项目里涉及的组件进行一一讲解 有助于大家更加深刻地理
  • 阿里矢量图刷新显示异常

    在vue中使用阿里矢量图遇到了刷新丢失问题 一开始我使用的是在根html中引入的方式 在使用过程中莫名的遇到了刷新丢失问题 于是更改了新的css引入方式 main js中新增引入 import font iconfont css 在vue模
  • 超详细Git下载安装配置使用教程,从入门到上传本地项目到GitHub,一文就够了

    前言 身为一个合格的程序Yuan Git工具我们必然是要掌握的 那么对于小白来讲一定有这几个疑问 Git是什么 怎么使用 怎么配置 Git命令是什么 本文将从这几方面帮助大家了解和使用Git 关于Git Git是一个开源的分布式版本控制系统
  • 前端的图片压缩image-compressor(可在图片上传前实现图片压缩)

    转载自 作者 言墨儿 链接 https www jianshu com p 3ce3e3865ae2 作者 UYOU 链接 https www imooc com article 40038 来源 慕课网 image compressor