uniapp --- 实现图片压缩(兼容H5)

目录

创建组件

在 template 中添加组件

方法说明:

compress() 方法参数:

progress 方法回调对象属性详细说明:

源码示例: 

 thank


Canvas 是 HTML5 提供的一个用于在网页上绘制图形的元素,它可以实现图片压缩的功能。而结和UnoApp是一种基于Canvas的图形编辑工具库,它提供了丰富的API和功能,可以帮助开发者在网页上实现各种图形编辑和处理操作。

实现图片压缩的原理在结和UnoApp中也是类似的,主要是通过Canvas的绘图功能来重新绘制图片并调整尺寸和质量。下面将详细介绍结和UnoApp实现图片压缩的步骤:

创建组件
<template><view class="compress" v-if="canvasId"><canvas :canvas-id="canvasId" :style="{ width: canvasSize.width, height: canvasSize.height }"></canvas></view>
</template><script>
export default {data() {return {pic: '',canvasSize: {width: 0,height: 0},canvasId: ''};},mounted() {// 创建 canvasIdif (!uni || !uni._helang_compress_canvas) {uni._helang_compress_canvas = 1;} else {uni._helang_compress_canvas++;}this.canvasId = `compress-canvas${uni._helang_compress_canvas}`;},methods: {// 压缩compressFun(params) {return new Promise(async (resolve, reject) => {// 等待图片信息let info = await this.getImageInfo(params.src).then((info) => info).catch(() => null);if (!info) {reject('获取图片信息异常');return;}// 设置最大 & 最小 尺寸const maxSize = params.maxSize || 1080;const minSize = params.minSize || 640;// 当前图片尺寸let { width, height } = info;// 非 H5 平台进行最小尺寸校验// #ifndef H5if (width <= minSize && height <= minSize) {resolve(params.src);return;}// #endif// 最大尺寸计算//(图像的宽度和高度是否超过最大尺寸。如果其中任一维度超过最大尺寸,代码将对图像进行调整,以使其适应最大尺寸并保持其宽高比。)// 这样可以确保图像在调整大小后仍保持原始比例,并且不会超过指定的最大尺寸if (width > maxSize || height > maxSize) {if (width > height) {height = Math.floor(height / (width / maxSize));width = maxSize;} else {width = Math.floor(width / (height / maxSize));height = maxSize;}}// 设置画布尺寸this.$set(this, 'canvasSize', {width: `${width}px`,height: `${height}px`});// Vue.nextTick 回调在 App 有异常,则使用 setTimeout 等待DOM更新setTimeout(() => {// 创建 canvas 绘图上下文(指定 canvasId)。在自定义组件下,第二个参数传入组件实例this,以操作组件内 <canvas/> 组件// Tip: 需要指定 canvasId,该绘图上下文只作用于对应的 <canvas/>const ctx = uni.createCanvasContext(this.canvasId, this);// 清除画布上在该矩形区域内的内容。(x,y,宽,高)ctx.clearRect(0, 0, width, height);// 绘制图像到画布。(所要绘制的图片资源,x,y,宽,高)ctx.drawImage(info.path, 0, 0, width, height);// 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中。// 本次绘制是否接着上一次绘制,即reserve参数为false,则在本次调用drawCanvas绘制之前native层应先清空画布再继续绘制;若reserver参数为true,则保留当前画布上的内容,本次调用drawCanvas绘制的内容覆盖在上面,默认 false// 绘制完成后回调ctx.draw(false, () => {// 把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。在自定义组件下,第二个参数传入自定义组件实例,以操作组件内 <canvas> 组件。uni.canvasToTempFilePath({x: 0, //画布x轴起点(默认0)y: 0, //画布y轴起点(默认0)width: width, //画布宽度(默认为canvas宽度-x)height: height, //画布高度(默认为canvas高度-ydestWidth: width, //图片宽度(默认为 width * 屏幕像素密度)destHeight: height, //输出图片高度(默认为 height * 屏幕像素密度)canvasId: this.canvasId, //画布标识,传入 <canvas/> 的 canvas-id(支付宝小程序是id、其他平台是canvas-id)fileType: params.fileType || 'png', //目标文件的类型,只支持 'jpg' 或 'png'。默认为 'png'quality: params.quality || 0.9, //图片的质量,取值范围为 (0, 1],不在范围内时当作1.0处理success: (res) => {// 在H5平台下,tempFilePath 为 base64resolve(res.tempFilePath);},fail: (err) => {reject(null);}},this);});}, 300);});},// 获取图片信息getImageInfo(src) {return new Promise((resolve, reject) => {uni.getImageInfo({src,success: (info) => {resolve(info);},fail: (err) => {console.log(err, 'err===获取图片信息');reject(null);}});});},// 批量压缩async compress(params) {// 初始化状态变量let [index, done, fail] = [0, 0, 0];let paths = [];// 处理待压缩图片列表let waitList = Array.isArray(params.src) ? params.src : [params.src];// 批量压缩方法let batch = async () => {while (index < waitList.length) {try {const path = await next();done++;paths.push(path);params.progress?.({ done, fail, count: waitList.length });} catch (error) {fail++;params.progress?.({ done, fail, count: waitList.length });}index++;}};// 单个图片压缩方法let next = () => {const currentSrc = waitList[index];return this.compressFun({src: currentSrc,maxSize: params.maxSize,fileType: params.fileType,quality: params.quality,minSize: params.minSize});};// 返回Promise并处理结果return new Promise((resolve, reject) => {try {batch().then(() => {if (typeof params.src === 'string') {resolve(paths[0]);} else {resolve(paths);}}).catch((error) => {reject(error);});} catch (error) {reject(error);}});}}
};
</script><style lang="scss" scoped>
.compress {position: fixed;width: 12px;height: 12px;overflow: hidden;top: -99999px;left: 0;
}
</style>

在 script 中引用组件

import helangCompress from '../../components/helang-compress/helang-compress';export default {components: {helangCompress}
}
在 template 中添加组件
<helang-compress ref="helangCompress"></helang-compress>
方法说明:
方法名可传参数必填说明
compress()Object【单张压缩】设置压缩的图片及压缩尺寸和压缩质量,参数详情请阅读下方 compress()方法参数
compress() 方法参数:
参数名类型必填默认值说明
srcString / Array-待压缩的图片地址,由相册选择或拍照获取。注意:若src的值为String压缩成功后则返回String,若为Array,压缩成功后则返回Array
maxSizeNumber1080压缩后的最大尺寸
fileTypeString'png'压缩后的文件类型,可选值 jpg、png
qualityNumber0.9压缩后的质量(仅jpg类型有效,原因可自行阅读官方canvas文档),可选值 0 ~ 1,值越大越清晰(图片也越大)
minSizeNumber640最小压缩尺寸,图片尺寸小于该时值不压缩,非H5平台有效。若想忽略该设置可以将该值设置为一个极小的值,比如一个负数(不能是0)

为使插件在 H5 平台统一返回 base64 数据,则故意取消 H5 平台对 minSize 的设置。H5平台压缩后的图片路径是 base64 格式,有跨平台需求须注意

progress 方法回调对象属性详细说明:
参数名类型说明
doneNumber已完成压缩的数量
failNumber压缩失败的数量
countNumber总共需要压缩的数量
源码示例: 

// 单张压缩
this.$refs.helangCompress.compressFun({src:this.paths[0],maxSize:800,fileType:'jpg',quality:0.85,minSize:640 //最小压缩尺寸,图片尺寸小于该时值不压缩,非H5平台有效。若需要忽略该设置,可设置为一个极小的值,比如负数。
}).then((res)=>{// 压缩成功回调
}).catch((err)=>{// 压缩失败回调
})// 批量压缩
this.$refs.helangCompress.compress({src:this.paths,maxSize:800,fileType:'jpg',quality:0.85,progress:(res)=>{console.log('压缩进度');console.log(res);}
}).then((res)=>{// 压缩成功回调
}).catch((err)=>{// 压缩成功回调
})
 thank

图片压缩 - 可以自定义压缩尺寸和压缩质量 - DCloud 插件市场

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

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

相关文章

介绍与部署 Zabbix 监控系统

目录 前言 一、监控系统 1、主流的监控系统 2、监控系统功能 二、Zabbix 监控系统概述 1、Zabbix 概念 2、Zabbix 主要特点 3、Zabbix 主要功能 4、Zabbix 监控对象 5、Zabbix 主要程序 6、Zabbix 监控模式 7、Zabbix 运行机制 8、Zabbix 监控原理 9、Zabbix 主…

mybatis批量查询List实体类

在 MyBatis 中进行批量查询 List 实体类的操作通常使用 foreach 标签来实现。下面是一个示例代码&#xff0c;展示了如何在 MyBatis 中批量查询 List 实体类&#xff1a; 根据主键id 假设有一个名为 User 的实体类&#xff1a; public class User {private Long id;private …

Python3中的模块

模块&#xff1a;创建的py文件 包&#xff1a;创建文件夹&#xff0c;文件夹中放很多的py文件 在一个py文件里调用另外一个py文件里的函数&#xff0c;例子 # 这个文件是主文件&#xff0c;app.py 文件# 调用其他自定义的模块 # 导入非嵌套层级的模块 import exampledef run(…

Git回滚操作,工作区和暂存区恢复修改删除的文件

在利用git协作过程中&#xff0c;经常需要进行代码的撤销操作&#xff0c;这个行为可能发生在工作区&#xff0c;暂存区或者仓库区&#xff08;或版本库&#xff09;。 我们先讨论在工作区与暂存区发生的撤销行为&#xff0c;这里会有两个命令提供帮助&#xff0c;git restore…

Day 15 Linux网络管理

IP解析 IP地址组成&#xff1a;IP地址由4部分数字组成&#xff0c;每部分数字对应于8位二进制数字&#xff0c;各部分之间用小数点分开&#xff0c;这是点分2进制。如果换算为10进制我们称为点分10进制。 每个ip地址由两部分组成网络地址(NetID)和主机地址(HostID).网络地址表…

Spring-Aop源码解析(中)

Spring-Aop源码解析&#xff08;上&#xff09;上文讲解了到底什么是Aop&#xff0c;以及围绕方法该如何去找对应的增强点&#xff0c;包括整个Advisor链路的执行顺序&#xff0c;本文来对上文中存在的一些关键点进行一个深入挖掘 Advice:要增强的逻辑&#xff0c;就是我们执行…

养猫必看!毛发护理秘籍,猫粮选择大揭秘!

亲爱的猫友们&#xff0c;我们都知道&#xff0c;猫咪的毛发是它们健康与美丽的象征。选择一款合适的猫粮&#xff0c;对于猫咪的毛发健康至关重要。那么&#xff0c;如何根据猫咪的毛发情况来选择合适的猫粮呢&#xff1f;接下来&#xff0c;就让我来为你详细解答吧&#xff0…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力&#xff0c;防止伪造和假冒签名等问题&#xff0c;是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景&#xff0c;帮助用户理解并有效应用PDF文档电子签名技术。 1.…

Unity HDRP 2021 Release-Notes

&#x1f308;Unity HDRP 2021 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2021.3.33HDRP: Added additional documentation for cached shadows of directional lights.2021.3.33HDRP: Added in which space custom velocity should be computed.…

lv_micropython for ESP32-S2/S3/C3

一、更新文件 lv_binding_micropython:GitHub - kdschlosser/lv_binding_micropython at esp32-s-c-h_support 下载lv_binding_micropython分支&#xff1a; git clone -b esp32-s-c-h_support https://github.com/kdschlosser/lv_binding_micropython.git 替换文件&#x…

如何高效解决电商API中的订单问题?

随着电子商务的迅猛发展&#xff0c;订单处理成为电商企业运营中的关键环节。为了提高订单处理的效率和质量&#xff0c;电商API&#xff08;应用程序接口&#xff09;的应用逐渐受到重视。本文将深入探讨电商API在订单处理中的高效解决方案&#xff0c;帮助电商企业优化订单处…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言&#xff1a; 最近在完成公司的项目时&#xff0c;为了兼容其他的版本&#xff0c;需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包&#xff0c;安装成功之后&#xff0c;分享如下&#xff1a; 安装命令&#xff1a; ant-design-vue&#xff1a; 不…

【MATLAB源码-第54期】基于白鲸优化算法(WOA)和遗传算法(GA)的栅格地图路径规划最短路径和适应度曲线对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1.白鲸优化算法&#xff08;WOA&#xff09;&#xff1a; 白鲸优化算法是一种受白鲸捕食行为启发的优化算法。该算法模拟了白鲸群体捕食的策略和行为&#xff0c;用以寻找问题的最优解。其基本思想主要包括以下几点&#xff…

Docker 学习笔记(九):Docker 网络原理,理解 docker0,虚拟网卡,容器互联,以及跨网络连通

一、前言 记录时间 [2024-4-16] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

Unity HDRP 2023 Release-Notes

&#x1f308;Unity HDRP 2023 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2023.2.17HDRP: Fixed game view flicker while on HDR and Reflection probe.(UUM-64343)2023.2.17HDRP: HDRP: Fixed invalid AABB error in the console when using th…

C# 截图并保存为图片

在winform开发中&#xff0c;有时会用到截图并保存为图片的时候&#xff0c;这里列了三种保存图片的可能情况。 将窗体截图保存成图片的方式是&#xff1a; Bitmap bit new Bitmap(this.Width, this.Height);//实例化一个和窗体一样大的bitmap Graphics g Graphics.FromImag…

Redis 核心知识点常考面试题(持续更新中)

Redis 核心知识点常考面试题&#xff08;持续更新中&#xff09; Redis单线程IO多路复用原理Redis缓存穿透、缓存雪崩、缓存击穿问题Redis与数据库双写不一致问题基于Redis实现分布式锁的的应用场景Redis持久化方式Redis内存淘汰机制Redis删除策略Redis主从复制、哨兵、集群Red…

AI时代的教育革命:智能教育的未来展望

人工智能技术正在以前所未有的速度和规模改变着我们的世界&#xff0c;而教育领域也不例外。本文将探讨人工智能在教育领域的应用现状和未来发展趋势&#xff0c;介绍智能教育的核心概念和关键技术&#xff0c;并通过案例分析和实践指南&#xff0c;展望智能教育的未来&#xf…

速盾:jquery可以用cdn加速吗?

CDN&#xff08;Content Delivery Network&#xff09;是一种优化网络传输的技术&#xff0c;通过将网站的相关静态资源缓存到全球各地的服务器节点上&#xff0c;可以加速网站的访问速度。jQuery是一款非常流行的JavaScript库&#xff0c;用于简化网页开发中的DOM操作、事件处…

回归损失函数

目录 1 MAE 2 MSE 3 MAPE 4 Quantile Loss分位数损失 回归损失函数也可以做为评价指标使用&#xff0c;但是有没有想过数据分布与损失函数之间的关系呢&#xff01; 使用特定损失函数的前提是我们对标签的分布进行了某种假设&#xff0c;在这种假设的前提下通过极大似然法推…