uniapp图片压缩之后在上传

压缩图片js方法,新建imgPress.js

/** * H5压缩 二分查找算法来找到一个合适的图像质量系数,使得压缩后的图片文件大小接近于目标大小* @param {Object} imgSrc 图片url * @param {Object} callback 回调设置返回值 * */
export function compressH5(fileItem, targetSizeKB, initialQuality = 1.0) {const maxQuality = 1.0;const minQuality = 0.0;const tolerance = 0.01; // 根据需要调整公差return new Promise((resolve, reject) => {const binarySearch = (min, max) => {const midQuality = (min + max) / 2;const reader = new FileReader();reader.readAsDataURL(fileItem);reader.onload = function () {const img = new Image();img.src = this.result;img.onload = function () {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = img.width;canvas.height = img.height;ctx.clearRect(0, 0, canvas.width, canvas.height);ctx.drawImage(img, 0, 0, canvas.width, canvas.height);// 使用异步的 toBlob 方法canvas.toBlob(async (blob) => {const fileSizeKB = blob.size / 1024;if (Math.abs(fileSizeKB - targetSizeKB) < tolerance || max - min < tolerance) {// 当前质量足够接近目标大小,使用当前质量解析resolve(URL.createObjectURL(blob));} else if (fileSizeKB > targetSizeKB) {// 如果文件大小太大,降低质量,继续二分查找binarySearch(min, midQuality);} else {// 如果文件大小太小,增加质量,继续二分查找binarySearch(midQuality, max);}}, 'image/jpeg', midQuality);};};reader.onerror = function (error) {reject(error);};};// 开始二分查找binarySearch(minQuality, maxQuality);});
}// app 或小程序压缩图片
// 压缩图片
export function compressImage(filePath, quality, successCallback, errorCallback) {uni.compressImage({src: filePath,quality: quality,success: (res) => {successCallback(res.tempFilePath);},fail: (err) => {errorCallback(err);}});
}// 二分查找压缩质量
export function binarySearchCompress(filePath, targetSize, low, high, successCallback, errorCallback) {if (low > high) {errorCallback("无法达到目标大小");return;}const mid = Math.floor((low + high) / 2);compressImage(filePath, mid, (tempFilePath) => {uni.getFileInfo({filePath: tempFilePath,success: (res) => {const currentSize = res.size;if (currentSize <= targetSize) {successCallback(tempFilePath);} else {// 递归调整压缩质量binarySearchCompress(filePath, targetSize, low, mid - 1, successCallback, errorCallback);}},fail: (err) => {errorCallback(err);}});}, (err) => {errorCallback(err);});
}

vue 页面调用

import {compressH5,binarySearchCompress} from './imgPress'

方法引入,注意:uploadCompressedImage方法上传里七牛云上传就需要七牛云token,里面处理图片可以根据需求修改,如果是上传后台,可以用后台方法上传。

// 上传图片upload(key){const that = thisuni.chooseImage({count: 1, //默认9sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有success: res => {console.log(res)// 获取文件的临时路径let avatar = res.tempFilePaths[0];let files = res.tempFiles[0]const fileSize = files.size;console.log('fileSize',fileSize)if(fileSize/1024/1024 >20){return that.$tools.toast('请上传20M以内的图片')}uni.showLoading({mask: true,});// 判断图片大小是否超过200KBif (fileSize > 200 * 1024) {//#ifdef H5//h5压缩图片const targetSizeKB = 150; // 设置目标文件大小,单位为KB,根据需求调整compressH5(files,targetSizeKB).then(file => {console.log('file 222 = ', file)that.uploadCompressedImage(file,key);}).catch(err => {console.log('catch', err)uni.hideLoading();})//#endif//#ifdef APP-PLUS || MP-WEIXIN// 如果超过200KB,进行压缩// 初始压缩质量范围const lowQuality = 1;const highQuality = 100;binarySearchCompress(files, targetSize, lowQuality, highQuality, (compressedFilePath) => {console.log("压缩成功,压缩后图片路径:", compressedFilePath);that.uploadCompressedImage(file,key);}, (err) => {console.error("压缩失败:", err);uni.hideLoading();})//#endif} else {// 如果未超过200KB,直接上传原图that.uploadCompressedImage(avatar,key);}},fail: (error) => {console.log(error);that.$tools.toast('上传图片接口调用失败')uni.hideLoading();},})},// 压缩上传uploadCompressedImage(avatar,key){const that = this// let avatar = res.tempFiles;let KeySrc = key+'Src'console.log(key,avatar)that[KeySrc] = avatar;that.$set(that,KeySrc,avatar)let now_time = new Date().getTime();uni.uploadFile({url: 'https://up-z2.qiniup.com', filePath: avatar,name: 'file',formData: {// 'key': now_time,'token': that.qiniu.qiniu_token,},success: (uploadFileRes) => {let uploadImgUrl = JSON.parse(uploadFileRes.data).key;// let backUrl = that.qiniu.qiniu_domain + '/' +uploadImgUrl;let backUrl = uploadImgUrl;that[key] = backUrl;that.$set(that,key,backUrl)console.log(key,this[key])uni.hideLoading();},fail: (error) => {console.log(error);uni.hideLoading();},complete: () => {setTimeout(function() {uni.hideLoading();}, 250);},});},

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

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

相关文章

nginx热更新详解及实战操作

Nginx热更新&#xff0c;也被称为平滑升级或热部署&#xff0c;是指在不中断Nginx服务的情况下&#xff0c;对Nginx进行升级或更新其配置&#xff0c;以实现业务的无损和用户无感知的升级过程。以下是关于Nginx热更新的详细解释&#xff1a; 一、Nginx热更新的原理 Nginx热更…

Kubernetes APIServer 几种基本认证方式

"认证"&#xff0c;形象地理解就是"你是谁"。在上文中&#xff0c;用户A在发起API请求时&#xff0c;管理员如何道该请求是用户A发起的呢&#xff1f;所以&#xff0c;客户端在发起API请求时&#xff0c;必须要携带一个身份信息来表明"我是谁"&a…

泰勒公式中拉格朗日余项和佩亚诺余项的区别及具体的应用场景案例

泰勒公式是微积分中的一个重要工具&#xff0c;用于将一个函数在某一点附近展开成多项式形式&#xff0c;以便于近似计算和分析。泰勒公式的一般形式为&#xff1a; f ( x ) f ( a ) f ′ ( a ) ( x − a ) f ′ ′ ( a ) 2 ! ( x − a ) 2 ⋯ f ( n ) ( a ) n ! ( x − a…

[CTF]-PWN:House of Cat堆题型综合解析

原理&#xff1a; 调用顺序&#xff1a; exit->_IO_wfile_jumps->_IO_wfile_seekoff->_IO_switch_to_wget_mode _IO_wfile_seekoff源码&#xff1a; off64_t _IO_wfile_seekoff (FILE *fp, off64_t offset, int dir, int mode) {off64_t result;off64_t delta, new…

AI绘画小白必备!Stable Diffusion常用插件合集,好用推荐!(附插件下载)

前言 宝子们&#xff0c;早上好啊~Stable Diffusion 常用插件&#xff0c;月月已经给大家整理好了&#xff0c;自取就好。 拥有这些SD常用插件&#xff0c;让您的图像生成和编辑过程更加强大、直观、多样化。以下插件集成了一系列增强功能&#xff0c;覆盖从自动补全提示词到…

开源项目:驱动创新与协作的时代引擎

《开源项目&#xff1a;驱动创新与协作的时代引擎》 在当今全球经济与科技环境瞬息万变的背景下&#xff0c;开源软件项目如同一颗璀璨的新星&#xff0c;在开发者社区的天空中熠熠生辉。其蓬勃发展的态势不仅成为了热门话题&#xff0c;更是引领着技术领域的变革潮流。 开源…

无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。【解决办法】

问题描述 新建好一台windows虚拟机&#xff0c;两台设备网络是互通的&#xff0c;但是物理机在访问虚拟机的网络共享文件资源时&#xff0c;出现图下所示的报错&#xff1a;XXX无法访问。你可能没有权限使用网络资源。请与这台服务器的管理员联系以查明你是否有访问权限。用户…

echarts无法加载Map地图的问题

项目场景&#xff1a; echarts无法加载Map地图的问题 详情 查阅相关资料讲&#xff0c;echarts4.9以上版本已经移除了map&#xff0c;那么我们就得重新打包echarts文件了。打包echarts.min.js的链接&#xff1a;https://echarts.apache.org/zh/builder.html 在这个链接页面可…

考完软考之后,如何评职称?是否有有效期?

一、软考和职称之间的关系 软考和职称之间的关系可以这样理解&#xff1a;拿到软考证书并不意味着就能获得职称。软考证书是技术等级证书&#xff0c;而职称则是一种资格。如果单位聘用你做工程师&#xff0c;那么你的软考证书就可以发挥作用&#xff0c;相当于获得了职称证。…

单商户和多商户的区别

单商户商城通常由单个企业或品牌运营&#xff0c;专注于销售自家产品&#xff0c;而多商户商城则类似于一个平台&#xff0c;允许多个商家入驻并销售各自的商品。它们在经营模式、商家入驻和运营投入等方面有所不同。具体分析如下&#xff1a; 经营模式 单商户商城&#xff1…

MES:连接计划与执行的桥梁

想象一下&#xff0c;你的企业拥有一份完美的生产计划&#xff0c;但如何将这份计划准确无误地转化为实际生产中的每一步操作&#xff1f;这就是MES大展身手的地方。MES作为ERP&#xff08;企业资源计划&#xff09;与车间自动化控制之间的桥梁&#xff0c;确保生产计划能够顺畅…

hf-mirror (huggingface 的国内镜像)

官网&#xff1a; https://hf-mirror.com/ 网站域名 hf-mirror.com&#xff0c;用于镜像 huggingface.co 域名。作为一个公益项目&#xff0c;致力于帮助国内AI开发者快速、稳定的下载模型、数据集。 如何使用HF-Mirror 方法一&#xff1a;网页下载 在https://hf-mirror.com/…

边框插画:成都亚恒丰创教育科技有限公司

边框插画&#xff1a;艺术与生活的精致边界 在视觉艺术的广阔天地里&#xff0c;边框插画以其独特的魅力和细腻的表达方式&#xff0c;成为连接艺术与生活的一道精致边界。成都亚恒丰创教育科技有限公司它不仅仅是图像的外框装饰&#xff0c;更是情感、故事与创意的延伸&#…

看到指针就头疼?这篇文章让你对指针有更全面的了解!

文章目录 1.什么是指针2.指针和指针类型2.1 指针-整数2.2 指针的解引用 3.野指针3.1为什么会有野指针3.2 如何规避野指针 4.指针运算4.1 指针-整数4.2 指针减指针4.3 指针的关系运算 5.指针与数组6.二级指针7.指针数组 1.什么是指针 指针的两个要点 1.指针是内存中的一个最小单…

【Python】ModuleNotFoundError: No module named ‘distutils.util‘ bug fix

【Python】ModuleNotFoundError: No module named distutils.util bug fix 1. error like this2. how to fix why this error occured , because i remove the origin version python of ubuntu of 20.04. then the system trapped in tty1 , you must make sure the laptop li…

MVC 返回集合方法,以及分页

返回一个数据集方法 返回多个数据集方法 》》定义一个Model public class IndexMoel {public List<UserGroup> UserGroup{get;set;}public List<User> User{get;set;}}》》》控制器 //db 是 EF 中的上下文 var listnew IndexModel(); list.UserGroupdb.UserGro…

微信小程序中wx.navigateBack()页面栈返回上一页时执行上一页的方法或修改上一页的data属性值

let pages getCurrentPages();let prevPage pages[pages.length - 2]; // 获取上一个页面实例对象console.log(prevPage) //打印信息// 在 wx.navigateBack 的 success 回调中执行需要的方法wx.navigateBack({delta: 1, // 返回上一页success: function() {//修改上一页的属性…

秒懂设计模式--学习笔记(8)【结构型-组合模式】

目录 7、组合模式7.1 组合模式&#xff08;Composite&#xff09;7.2 叉树结构7.3 文件系统7.4 目录树展示7.5 自相似性的涌现7.6 组合模式的各角色定义7.7 组合 7、组合模式 7.1 组合模式&#xff08;Composite&#xff09; 是针对由多个节点对象&#xff08;部分&#xff0…

关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论

目录 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失效 问题六&#xf…

个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)

目录 一、效果展示 二、项目概述 三、手把手快速搭建实现本项目 3.1 前端实现 3.2 后端方向 五、后续开发计划 一、效果展示 默认展示 一般对话展示&#xff1a; 代码对话展示&#xff1a; 二、项目概述 本项目是一个基于Web的智能对话服务平台&#xff0c;通过后端与第…