uniapp 上传压缩图片 兼容h5和小程序的方法

这篇具有很好参考价值的文章主要介绍了uniapp 上传压缩图片 兼容h5和小程序的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目是用uniapp开发的,当时只是做App端,后来项目扩展到H5端, uniapp框架可以跨平台所以移动端和H5使用的是一套代码
上传头像的时候要求图片的大小在2MB一下,所以要压缩图片,App端当时使用的是uni.compressImage(OBJECT)压缩的(详情见:https://uniapp.dcloud.net.cn/api/media/image.html#compressimage 但是H5不兼容;
先搞定H5的压缩吧!网上一搜一大把


/** 
 * 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);
     });
 }


调用方法

			chooseImg1() {
			    uni.chooseImage({
					count: 1, //默认9
					sizeType:['compressed'],
			        success: (chooseImageRes) => {
			            const tempFilePaths = chooseImageRes.tempFilePaths;
			            const filePath = tempFilePaths[0];
			            // 获取图片文件大小
			            uni.getFileInfo({
			                filePath: filePath,
			                success: (fileInfo) => {
			                    const fileSize = fileInfo.size; // 图片文件大小,单位为B
			                    // 判断图片大小是否超过200KB
			                    if (fileSize > 200 * 1024) {
									//#ifdef H5
									 //h5压缩图片
																		 const targetSizeKB = 150; // 设置目标文件大小,单位为KB,根据需求调整
compressH5(chooseImageRes.tempFiles[0],targetSizeKB).then(file => {
											console.log('file 222 = ', file)
											this.uploadCompressedImage(file);
											}).catch(err => {
												console.log('catch', err)
									 })
									//#endif
									//#ifdef APP-PLUS || MP-WEIXIN
			                        // 如果超过200KB,进行压缩
			                        uni.compressImage({
			                            src: filePath,
			                            quality: 10, // 设置压缩质量(0-100)- 根据需求进行调整
			                            success: (compressRes) => {
			                                // 压缩成功后的逻辑
			                                this.uploadCompressedImage(compressRes.tempFilePath);
			                            },
			                            fail: (err) => {
			                                console.error('压缩图片失败:', err);
			                                uni.showToast({
			                                    title: '压缩图片失败,请重试',
			                                    icon: 'none'
			                                });
			                            }
			                        });
									//#endif
			                    } else {
			                        // 如果未超过200KB,直接上传原图
			                        this.uploadCompressedImage(filePath);
			                    }
			                },
			                fail: (err) => {
			                    console.error('获取文件信息失败:', err);
			                    uni.showToast({
			                        title: '获取文件信息失败,请重试',
			                        icon: 'none'
			                    });
			                }
			            });
			        },
			        fail: (err) => {
			            console.error('选择图片失败:', err);
			            uni.showToast({
			                title: '选择图片失败,请重试',
			                icon: 'none'
			            });
			        }
			    });
			},
	uploadCompressedImage(filePath) {
			        uni.uploadFile({
			            url: `${this.$VUE_APP_API_URL}/common/image/image/upload/faceImg`,
						filePath: filePath,
			            name: 'file',
			            header: {
			                'Authorization': uni.getStorageSync('X-Token'), // 修改为你的访问令牌
			            },
						success: (res) => {
							uni.hideLoading(); // 隐藏 loading
							if (res.statusCode === 200) {
								console.log('上传成功:', res.data);
								const responseData = JSON.parse(res.data); // 解析返回的数据
								console.log(responseData,'responseData')
								// 处理上传成功后的逻辑
								if(responseData.code==200){
									this.contractImage1 = responseData.data
									uni.setStorageSync('faceUrl',this.contractImage1)
								}else{
									uni.$u.toast(responseData.msg);
								}
							} else {
								console.error('上传失败', res.statusCode);
								uni.showToast({
									title: res.msg, // 自定义错误信息
									icon: 'none'
								});
							}
						},
			            fail: (err) => {
			                console.error('上传失败:', err);
			                uni.showToast({
			                    title: '上传失败,请重试',
			                    icon: 'none'
			                });
			            }
			        });
			    },

即能兼容h5也能兼容微信小程序和各个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文件引用文章来源地址https://www.toymoban.com/news/detail-854619.html

//#ifdef APP-PLUS || MP-WEIXIN
			                        // 如果超过200KB,进行压缩
												
									  const tempFilePath = chooseImageRes.tempFilePaths[0];
									  const targetSizeKB = 200;
									  // 将目标大小转换为字节数
									  const targetSize = targetSizeKB * 1024;
									  // 初始压缩质量范围
									  const lowQuality = 1;
									  const highQuality = 100;
									  binarySearchCompress(tempFilePath, targetSize, lowQuality, highQuality, (compressedFilePath) => {
									      console.log("压缩成功,压缩后图片路径:", compressedFilePath);
										     this.uploadCompressedImage(compressedFilePath);
										  
									  }, (err) => {
									      console.error("压缩失败:", err);
									  })

									//#endif

到了这里,关于uniapp 上传压缩图片 兼容h5和小程序的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniApp移动端-H5-微信小程序上传文件(图片,文档和视频等)

    封装了一个插件可直接使用: 插件地址:uniApp移动端-H5-小程序上传文件(图片,文档和视频等),插件可直接用Hbuilderx导入示例项目查看, 实现方法: H5内部是使用uni-app官方内部方法uni.chooseFile 小程序端因hybrid不能使用本地HTML,所以插件提供的是uni-app官方内部方法wx.cho

    2024年02月12日
    浏览(59)
  • uniapp-图片压缩(适配H5,APP)

    uniapp本身是自带压缩图片的方式的,但是他只适用于APP,做不到多端的适配,如果只考虑app,就非常容易实现了。 使用uni.compressImage()这个API即可 要适配H5和APP可以使用canvas的方式进行压缩 原理:按照需求等比例创建空白画布,将图片粘到画布上,最后保存画布的base64流

    2024年02月07日
    浏览(48)
  • uni-app - 头像图片裁剪组件(支持多种裁剪,手势控制旋转或缩放、内外部控制图片移动、提供上传后端接口方案、头像图片美化)全端完美兼容 H5 App 小程序,最好用的图片上传后裁剪插件教程源代码

    网上的教程代码非常乱且都有 BUG 存在,非常难移植到自己的项目中,而且很难。 实现了 完美兼容 H5 App 小程序,选取手机本地相册或拍照,图片上传裁切内置多种方案,样式随便改, 本文代码干净整洁注释详细,您一键复制源码后参照示例几分钟就能完事, 如下图 真机测

    2024年02月17日
    浏览(102)
  • uniapp 上传图片时压缩图片

    提示:这里简述项目相关背景: 最近用uniapp做一个上传图片,要把图片大小压缩到200kb,然后传给后端 image-conversion:一个简单易用的JS图像转换工具,可以指定大小以压缩图像 npm i image-conversion --save const imageConversion = require(“@/components/image-conversion”);

    2024年02月12日
    浏览(38)
  • uniapp 之 多端实现图片压缩(含H5实现)

    compressImage 说明 文档平台差异说明已标出:官网提供的api uni.compressImage 除了 H5 平台,其余平台都支持,所以我们利用条件编译,然后单独处理一下H5的图片压缩即可。 utils.js 里面封装一下该方法,方便调用 封装的这个方法,只是将图片地址返回了,也可以根据具体的实际场

    2024年02月13日
    浏览(69)
  • H5项目中使用微信JS-SDK(以H5项目批量上传图片为例,兼容IOS及安卓)

    H5项目中使用微信图片上传相关sdk,主要用于解决 1.安卓手机无法一次选择多张图片进行上传问题;2.控制IOS系统手机一次可无限量选择图片上传的问题 一、准备工作:公众号配置 验证所需使用的sdk是否符合需求 可在使用场景中,打开微信官方提供的 微信SDKDemo 链接,或企业

    2024年02月07日
    浏览(51)
  • uniapp图片或文件的预览和下载,兼容ios+安卓+浏览器+企业微信H5

    在uniapp的APP日常开发中,我们时常遇到一些兼容性问题,正如本文所提到的图片的预览和下载。在此功能的开发中,我常遇到以下四个问题: 图片预览功能实现,但是PDF,word,xls文件无法打开。 安卓的图片预览和文件查看功能正常,ios系统的手机却问题频出,时不时的无法打

    2023年04月10日
    浏览(49)
  • uniapp下上传图片后图片裁剪加图片旋转,支持H5和app

    效果图 代码如下

    2024年02月15日
    浏览(80)
  • uniapp实现扫码功能兼容小程序和h5

    主要是针对h5端,uniapp自带的扫码方法不支持h5的 对于h5而言需要借助jweixin来实现,也就是微信的扫码功能 实现方式: 可通过npm安装 npm install jweixin-module 引入安装的npm包 import jweixin from \\\'jweixin-module\\\' 在onLoad方法中加载获取签名的方法 onLoad() {             this.wx_sanCode() }

    2024年02月13日
    浏览(45)
  • uniapp多行文本展开或收起(兼容h5、微信小程序,其它未测试)

    文本过短时隐藏按钮,需要知道文本全部展示的行数 文本收起时,微信小程序不能直接获取文本展示的高度 文本展示时,微信小程序不能直接获取文本收起的高度 所以使用 占位文本 获取单行文本高度,最终通过计算得到文本全部展示时的行数 本文介绍的方法兼容h5、微信

    2024年02月02日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包