vue图片压缩

1.使用插件

    1.image-conversion

     1.1安装

npm i image-conversion --save

     1.2使用

//引用
import * as imageConversion from 'image-conversion'//使用(主要方法)//压缩到指定大小
beforeAvatarUpload(file) {const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';const isLt2M = file.size / 1024 / 1024 < 2;if (!isJpgOrPng) {//自己封装的错误提示方法this.$message.error('上传图片只能是 JPG 或 PNG 格式!');}if (!isLt2M) {this.$message.error('上传图片大小不能超过 2MB!');}if (!isLt2M || !isJpgOrPng) {return false;}return new Promise((resolve) => {// 压缩到100KB,这里的100就是要压缩的大小,可自定义imageConversion.compressAccurately(file, 100).then(res => {resolve(res);});})
}//质量为0.6进行压缩return new Promise((resolve) => {imageConversion.compress(file, 0.6).then((res) => {resolve(res)})
})

2.base64图片压缩

let targetObj = {// 51.4kbsrc: ''//自己的base64文件
}
function compressImg (base64, multiple, useImg, targetObj) {// 第一个参数就是需要加密的base65,// 第二个是压缩系数 0-1,// 第三个压缩后的回调 用来获取处理后的 base64if (!base64) {return}// const _this = thisconst length = base64.length / 1024// 压缩方法let newImage = new Image()let quality = 0.6    // 压缩系数0-1之间newImage.src = base64newImage.setAttribute('crossOrigin', 'Anonymous') // url为外域时需要let imgWidth,imgHeightlet w = undefinednewImage.onload = function () {// 这里面的 this 指向 newImage// 通过改变图片宽高来实现压缩w = this.width * multipleimgWidth = this.widthimgHeight = this.heightlet canvas = document.createElement('canvas')let ctx = canvas.getContext('2d')if (Math.max(imgWidth, imgHeight) > w) {if (imgWidth > imgHeight) {canvas.width = w// 等比例缩小canvas.height = w * (imgHeight / imgWidth)} else {canvas.height = w// 等比例缩小canvas.width = w * (imgWidth / imgHeight)}} else {canvas.width = imgWidthcanvas.height = imgHeight// quality 设置转换为base64编码后图片的质量,取值范围为0-1  没什么压缩效果// 还是得通过设置 canvas 的宽高来压缩quality = 0.6}ctx.clearRect(0, 0, canvas.width, canvas.height)ctx.drawImage(this, 0, 0, canvas.width, canvas.height) //  // 这里面的 this 指向newImagelet smallBase64 = canvas.toDataURL('image/jpeg', quality) // 压缩语句// 如想确保图片压缩到自己想要的尺寸,如要求在50-150kb之间,请加以下语句,quality初始值根据情况自定// while (smallBase64.length / 1024 > 150) {// quality -= 0.01;// smallBase64 = canvas.toDataURL("image/jpeg", quality);// }// 防止最后一次压缩低于最低尺寸,只要quality递减合理,无需考虑// while (smallBase64.length / 1024 < 50) {// quality += 0.001;// smallBase64 = canvas.toDataURL("image/jpeg", quality);// }// 必须通过回调函数返回,否则无法及时拿到该值,回调函数异步执行console.log(`压缩前:${length}KB`)console.log(`压缩后:${smallBase64.length / 1024} KB`)useImg(smallBase64, targetObj)}}function useImg (base64, targetObj) {// targetObj 通过值引用的特性  用处理后的 base64 覆盖 处理前的 base63console.log('压缩后的 base64 :', base64)targetObj.src = base64 }compressImg(targetObj.src, 0.5, useImg, targetObj)

3.二分法实现(与base64图片压缩原理相同 )

function compressPic(file, size, device) {const reader = new FileReader() // 创建 FileReaderreader.readAsDataURL(file)reader.onload = ({ target: { result: src } }) => {const image = new Image() // 创建 img 元素image.src = srcconst canvas = document.createElement('canvas') // 创建 canvas 元素 image.onload = () => {canvas.width = image.widthcanvas.height = image.heightcanvas.getContext('2d').drawImage(image, 0, 0, image.width, image.height) // 绘制 图片到canvas上let canvasURL, nearFile // 创建变量 图片的file 最接近目标大小的filelet pointDirection = true // 设置默认的二分方向 true为加二分值 false为减二分值let quality = 0for (let i = 1; i <= device; i++) {canvasURL = canvas.toDataURL(file.type, pointDirection ? (quality += 1 / (2 ** i)) : (quality -= 1 / (2 ** i)))let blob = dataURLtoBlob(canvasURL) // 此方法为base64转化为blod方法 见上方miniFile = blobToFile(blob, 'new' + file.name, file.type) // 此方法为blod转file方法// 上方调用的两个方法  dataURLtoBlod和blobToFile已经更新到下方文章中 可拿来直接使用}return miniFile}}
}

base64转blob

图片file转base64编码

图片url转base64编码

blob转file​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/782384.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关系型数据库mysql(7)sql高级语句①

目录 一.MySQL常用查询 1.按关键字&#xff08;字段&#xff09;进行升降排序 按分数排序 &#xff08;默认为升序&#xff09; 按分数升序显示 按分数降序显示 根据条件进行排序&#xff08;加上where&#xff09; 根据多个字段进行排序 ​编辑 2.用或&#xff08;or&…

Rust语言中Option和Result两种类型的使用

异同之处 不同之处主要在于用途不同 都可以用于Error handle的&#xff0c;都是枚举类型,都可以作为function的返回类型&#xff0c; 二者源码如下 pub enum Option<T> {None,Some(T), }pub enum Result<T, E> {Ok(T),Err(E), }为什么这么设计 有场景才有设计的…

ESP8266 控制 LED 亮灭

一、引脚对应 二、按键控制 LED 亮灭 2.1样例1 #include <ESP8266WiFi.h>const int ledPin D2; // LED 连接到 D2 引脚 const int keyPin D4; // 按键连接到 D4 引脚volatile bool flag false; // 记录 LED 状态的标志// 外部中断处理函数 ICACHE_RAM_ATTR void han…

重新温习广软puthon爬虫技术。

下面是我不断试错的一个过程&#xff0c;好多知识点全忘记了&#xff0c;只能不断调实例&#xff0c;不断优化&#xff0c;重构&#xff0c;实现自己的需求。下面是我的运行截图。还是导包的问题。 个人感觉关键的还是这几部&#xff0c;被划了下划线的&#xff0c;存在问题&a…

【智能算法】猎人猎物算法(HPO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2022年&#xff0c;Naruei等人受到自然界动物猎食过程启发&#xff0c;提出了猎人猎物算法&#xff08;Hunter-Prey Optimization&#xff0c; HPO&#xff09;。 2.算法原理 2.1算法思想 HPO模拟…

输出1到10的阶乘--C语言

#include<stdio.h> int fac(int n){if(n<1){return 1;}elsereturn fac(n-1)*n; } int main(){int i, result;for(i1;i<10;i){resultfac(i);printf("%d!%d\n",i,result);}} 输出结果&#xff1a;

Java并发编程基础_Thread类

线程 Thread.class 1. 线程的六种状态 NEW 尚未启动的线程处于此状态。RUNNABLE 在Java虚拟机中执行的线程处于此状态。BLOCKED 被阻塞等待监视器锁定的线程处于此状态。WAITING 正在等待另一个线程执行特定动作的线程处于此状态。TIMED_WAITING 正在等待另一个线程执行动作达到…

C++中浅拷贝和深拷贝对象复制概念

1.浅拷贝&#xff08;Shallow Copy&#xff09;&#xff1a; 浅拷贝是指在对象复制时&#xff0c;只是复制对象的值&#xff0c;而不会复制对象指向的资源。这意味着对象和其副本会指向同一块内存空间&#xff0c;当一个对象改变时&#xff0c;另一个对象也会受到影响。 #inclu…

中国电子学会(CEIT)2021年09月真题C语言软件编程等级考试四级(含详细解析答案)

中国电子学会&#xff08;CEIT&#xff09;考评中心历届真题&#xff08;含解析答案&#xff09; C语言软件编程等级考试四级 2021年09月 编程题四道 总分:100分一、吃奶酪&#xff08;25分&#xff09; Jerry准备偷吃Tom的奶酪。所有的奶酪排成了一条直线&#xff0c;…

回溯算法|216.组合总和III

力扣题目链接 class Solution { private:vector<vector<int>> result; // 存放结果集vector<int> path; // 符合条件的结果// targetSum&#xff1a;目标和&#xff0c;也就是题目中的n。// k&#xff1a;题目中要求k个数的集合。// sum&#xff1a;已经收集…

OpenKylin安装Kafka

一、操作系统 openKylin 1.0.1 X86 二、下载安装包 # 安装依赖jdk sudo apt-get update sudo apt-get install default-jdk # 下载kafka mkdir -p /data/software/kafka wget https://archive.apache.org/dist/kafka/2.4.1/kafka_2.13-2.4.1.tgz三、解压安装 # 解压缩Kafka…

springboot项目学习-瑞吉外卖(4)续

1.任务 菜品的添加功能(涉及到两张表的数据添加) 2.菜品添加 功能页面如上&#xff0c;该页面有两个注意点 菜品分类&#xff1a;点击菜品分类后&#xff0c;会展示当前已有菜品&#xff1a;这个功能的实现要从category表里查询数据&#xff0c;然后再做展示口味做法配置&#…

算法题->移动零的C语言和JAVA的双指针解法

使用C语言和JAVA代码通过双指针进行解题 题目描述:给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 理解题意:不改变数组中非零元素的顺序,并把0元素放在非零元素后面. 链接: https://leetcode.cn/problems/m…

Linux——将云服务器作为跳板机,frp实现内网穿透

文章目录 操作步骤1. 准备工作&#xff1a;2. 配置frp服务器端&#xff1a;3. 配置frp客户端&#xff1a;4. 启动frp客户端&#xff1a;5. 测试连接&#xff1a;6. 安全注意事项&#xff1a; 云服务器性能分析阿里云具体操作步骤1. 购买&#xff1a;2. 登录&#xff1a;3. 首次…

【springboot】闲话 springboot 的几种异步机制 及 长轮询的概念和简单实现

文章目录 引子springboot的几种异步形式开启异步支持和线程池配置&#xff08;重要&#xff09;第一种&#xff1a;Async第二种&#xff1a;Callable<T>第三种&#xff1a;WebAsyncTask<T>第四种&#xff1a;DeferredResult<T> 长轮询的简单实现概念实现服务…

spring boot-引入Redis并封装redistemplate操作工具类

文章目录 一、关于spring-redis二、springboot引入Redis及其使用案例三、封装redistemplate操作工具类 一、关于spring-redis spring-data-redis针对jedis提供了如下功能&#xff1a; 连接池自动管理&#xff0c;提供了一个高度封装的“RedisTemplate”类 针对jedis客户端中大…

设置 Linux 时间同步 同步硬件时钟

设置 Linux 时间同步 同步硬件时钟 配置 NTP 客户端查看当前系统时间使用 ntpdate 命令手动同步时间同步硬件时钟再次检查硬件时钟参考 配置 NTP 客户端 vim /etc/systemd/timesyncd.conf[Time] NTPcn.pool.ntp.org FallbackNTPasia.pool.ntp.org ntp.aliyun.com ntp1.aliyun.…

acwing算法提高之图论--单源最短路的扩展应用

目录 1 介绍2 训练 1 介绍 本专题用来记录使用。。。。 2 训练 题目1&#xff1a;1137选择最佳线路 C代码如下&#xff0c; #include <iostream> #include <cstring> #include <algorithm> #include <queue>using namespace std;const int N 101…

编译amd 的 amdgpu 编译器

1,下载源码 git clone --recursive https://github.com/ROCm/llvm-project.git 2, 配置cmake cmake -G "Unix Makefiles" ../llvm \ -DLLVM_ENABLE_PROJECTS"clang;clang-tools-extra;compiler-rt" \ -DLLVM_BUILD_EXAMPLESON …

springboot企业级抽奖项目业务四 (缓存预热)

缓存预热 为什么要做预热: 当活动真正开始时&#xff0c;需要超高的并发访问活动相关信息 必须把必要的数据提前加载进redis 预热的策略: 在msg中写一个定时任务 每分钟扫描一遍card_game表 把(开始时间 > 当前时间)&& (开始时间 < 当前时间1分钟)的活动及相…