一、在组件包下新建compressImage.js

 // 压缩图片
// eslint-disable-next-line no-unused-vars
export function compressImage (file, config) {
// eslint-disable-next-line no-unused-vars
let src
// eslint-disable-next-line no-unused-vars
let files
// let fileSize = parseFloat(parseInt(file['size']) / 1024 / 1024).toFixed(2)
const read = new FileReader()
read.readAsDataURL(file)
return new Promise(function (resolve, reject) {
read.onload = function (e) {
let img = new Image()
img.src = e.target.result
img.onload = function () {
// 默认按比例压缩
let w = config.width
let h = config.height
// 生成canvas
let canvas = document.createElement('canvas')
let ctx = canvas.getContext('2d')
let base64
// 创建属性节点
canvas.setAttribute('width', w)
canvas.setAttribute('height', h)
ctx.drawImage(this, 0, 0, w, h)
// 如果图片超过2m 那么压缩0.2
base64 = canvas.toDataURL(file['type'], config.quality)
     
// 回调函数返回file的值(将base64编码转成file)
// files = dataURLtoFile(base64) // 如果后台接收类型为base64的话这一步可以省略 // 回调函数返回file的值(将base64转为二进制)
let fileBinary = dataURLtoBlob(base64) resolve(fileBinary)
}
}
})
};

  // 将base64转为二进制
function dataURLtoBlob (dataurl) {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new Blob([u8arr], { type: mime })
} // base64转码(将base64编码转回file文件) 此方法我没用到
// eslint-disable-next-line no-unused-vars
function dataURLtoFile (dataurl) {
let arr = dataurl.split(',')
let mime = arr[0].match(/:(.*?);/)[1]
let bstr = atob(arr[1])
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], { type: mime })
}

二、在所需页面引入compressImage.js

import { compressImage } from '@/components/compressImage'// 图片压缩方法

三、使用方法

let config = {
  width: 100, // 压缩后图片的宽
  height: 100, // 压缩后图片的高
  quality: 1 // 压缩后图片的清晰度,取值0-1,值越小,所绘制出的图像越模糊
} compressImage(file, config)
  .then(result => { // result 为压缩后二进制文件
    this.methodA(result)
  })

四、拿到压缩后的二进制文件该怎样发送给后台呢?(我后台用的是  MultipartFile file)

methodA(result) {
  let fileData = new FormData()
  fileData.append('file', result)
  methodB(fileData)
    .then(res => {
      
    })
}

ok,结束!vue菜鸟一枚请多指教  (*^▽^*)

Vue前端压缩图片的更多相关文章

  1. antdv的Upload组件实现前端压缩图片并自定义上传功能

    Ant Design of Vue的Upload组件有几个重要的api属性: beforeUpload: 上传文件之前的钩子函数,支持返回一个Promise对象. customRequest: 覆盖组 ...

  2. js使用canvas在前端压缩图片

    HTML代码: <input id="file" type="file"> JS代码: var eleFile = document.querySe ...

  3. 结合Vue.js的前端压缩图片方案

    这是一个很简单的方案.嗯,是真的. 为什么要这么做? 在移动Web蓬勃发展的今天,有太多太多的应用需要让用户在移动Web上传图片文件了,正因如此,我们有些困难必须去攻克: 低网速下上传进度缓慢,用户体 ...

  4. canvas前端压缩图片

    参考网上的用法,下面是利用canvas进行的图片压缩 <!DOCTYPE html> <html> <head> <meta charset="ut ...

  5. canvas前端压缩图片和视频首屏缩略图并上传到服务器

    图片: var img = document.createElement('img') img.src = window.URL.createObjectURL(fileObj.file) // 加载 ...

  6. 前端压缩图片,前端压缩图片后转换为base64.

    今天利用一上午研究了一下前端如何将5m左右的照片转换base64大小为 100k以内! 有两个链接:https://www.cnblogs.com/007sx/p/7583202.html :http ...

  7. 了解JS压缩图片,这一篇就够了

    前言 公司的移动端业务需要在用户上传图片是由前端压缩图片大小,再上传到服务器,这样可以减少移动端上行流量,减少用户上传等待时长,优化用户体验. 插播一下,本文案例已整理成插件,已上传npm ,可通过 ...

  8. 基于前台vue,后台是spring boot的压缩图片上传

    本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot.其中有一个需求是需要做前端上传的图片需要压缩才能上传.为此在网上查找资料,并做了简单的实现. 那么一步来 ...

  9. .NET压缩图片保存 .NET CORE WebApi Post跨域提交 C# Debug和release判断用法 tofixed方法 四舍五入 (function($){})(jQuery); 使用VUE+iView+.Net Core上传图片

    .NET压缩图片保存   需求: 需要将用户后买的图片批量下载打包压缩,并且分不同的文件夹(因:购买了多个用户的图片情况) 文章中用到了一个第三方的类库,Nuget下载 SharpZipLib 目前用 ...

随机推荐

  1. PowerPC-Link Command File解析

    https://mp.weixin.qq.com/s/CATWma2mv5IPYGtKZLuGDA   以Code Warrior 11生成的flash版本(FLASH.lcf)为例   一. 参考资 ...

  2. Java实现 LeetCode 599 两个列表的最小索引总和(使用hash提高效率)

    599. 两个列表的最小索引总和 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅 ...

  3. Java实现 LeetCode 64 最小路径和

    64. 最小路径和 给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 示例: 输入: [ [1,3,1], ...

  4. Java实现 LeetCode 45 跳跃游戏 II(二)

    45. 跳跃游戏 II 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃次数到达数组的最后一个位置. 示例: 输入: [ ...

  5. 全网最全测试点总结:N95 口罩应该如何测试?

    引言 随着”新冠疫情“慢慢地消散,各大企业都开始恢复正常的运行,因为疫情造成很多工作人员的流失,企业也开始疯狂的招聘新鲜的人才,这对于莘莘求职者无疑是个机会,但是因为求职者众多,很多面试官也开始想方设 ...

  6. Java与Swift对比

    本文链接:http://blog.csdn.net/msyqmsyq/article/details/53538159 从Java到Swift还是比较简单的,相比Object-C,Swift和Java ...

  7. js排他性算法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 01.vue-router的基本使用

    Vue前端路由 1. npm install vue-router --save 2.脚手架安装 一.目录结构 二.index.js // 0.导入vue和路由插件 import Vue from ' ...

  9. protobuf安装流程

    protobuf安装流程 环境 平台 ​ Ubuntu16.04 依赖 autoconf automake libtool curl make g++ 安装流程 在Ubuntu / Debian上,您 ...

  10. pytest 多个PY文件执行共享变量及用fixture和conftest

    ------------恢复内容开始------------ 1.pytest需要测试多个py文件,这些文件有一定的依赖关系,同时执行的时候,需要只执行一次初始化setup,结束再执行一次teardo ...