uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)

本文主要是介绍uni-app小程序项目中实现前端图片压缩实现方式(附详细代码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)》在uni-app开发中,文件上传和图片处理是很常见的需求,但也经常会遇到各种问题,下面:本文主要介绍uni-app小程序项目中实...

方式一:使用<canvas>实现图片压缩(推荐,兼容性好)

这是最常见的一种方式,通过将图片绘制到 <canvas> 上,然后用 canvas.toTempFilePathcanvas.toDataURL 得到压缩后的图片。

示例代码(小程序平台):

<template>
  <view>
    <button @click="chooseImage">选择图片并压缩</button>
  </view>
</template>

<script>
export default {
  methods: {
    chooseImage() {
      uni.chooseImage({
      China编程  count: 1,
        success: (res) => {
          const tempFilePath = res.tempFilePaths[0];
          this.compressImage(tempFilePath);
        }
      });
    },

    compressImage(path) {
      // 创建 canvas 实例
      const ctx = uni.createCanvasContext('myCanvas', this);
      uni.getImageInfo({
    www.chinasem.cn    src: path,
        success: (img) => {
          const maxW = 800; // 最大宽度
          const scale = maxW / img.width;
          const w = maxW;
          const h = img.height * scale;

          // 画图
          ctx.drawImage(path, 0, 0, w, h);
          cwww.chinasem.cntx.draw(false, () => {
            // 延迟一点,确保画完
            setTimeout(() => {
              uni.canvasToTempFilePath({
                canvasId: 'myCanvas',
                destWidth: w,
                destHeight: h,
                success: (res) => {
                  console.log('压缩后图片路径:', res.tempFilePath);
                  // 可以用 res.tempFilePath 上传或预览
                },
                fail: (err) => {
                  console.error('canvas 转图片失败', err);
                }
              }, this);
            }, 200);
          });
        }
      });
    }
  }
};
</script>

<canvas canvas-id="myCanvas" />

方式二:使用uni.compressImageAPI(简单但压缩能力有限)

这是 uni-app 封装的一个简单压缩接口,用于压缩临时文件路径图片

uni.chooseImage({
  count: 1,
  success: (res) => {
    const filePath = res.tempFilePaths[0];
    uni.compressImage({
      src: filePath,
      quality: 80, // 取值 0 - 100,越小压缩率越高
      success: (res) => {
        console.log('压缩成功:', res.tempFilePath);
      },
      fail: (err) => {
        console.error('压缩失败:', err);
      }
    });
  }
});

注意:

  • uni.compressImage 目前只支持 App 和微信小程序平台,在 H5 和其他平台会失效或无效果。

  • 图片质量压缩效果受限,不能调整尺寸。

方式三:使用三方库(仅 H5 适用,如compressorjs)

这种方式适合在 H5 中运行的 uni-app 项目,小程序端不支持 DOM。

npm install compressorjs
import Compressor from 'compressorjs';

new Compressor(file, {
  quality: 0.6,
  success(result) {
    console.log('压缩后的 Blob:', result);
    // 你可以用 FileReader 或 FormData 处理这个文件
  },
  error(err) {
    console.error(err.message);
  },
});
方式平台支持优点缺点
Canvas 压缩✅ 微信小程序、App自由控制尺寸和质量,通用性强需要一定代码量
uni.compressImage✅ 微信小程序、App简单易用无法控制尺寸,兼容性不够
compressorjs❌ 仅 H5封装好,效果不错不支持小程序环境

 最后:封装公共方法

// utils/compressImage.js

/**
 * 通用图片压缩函数(兼容小程序/APP/H5)
 * @param {String} src 原始图片路径
 * @param {Object} options 配置项 { quality, width, height }
 * @returns {Promise<String>} 返回压缩后图片路径
 */
export function compressImage(src, options = {}) {
  const { quality = 0.7, width = 800, height = null } = options;

  return new Promise((resolve, reject) => {
    // 判断运行平台
    const system = uni.getSystemInfoSync().platform;

    // 优先使用 canvas 压缩
    #ifdef MP-WEIXIN || APP-PLUS
    uni.getImageInfo({
      src,
      success(imgInfo) {
        const ratio = width / imgInfo.width;
        const targetWidth = width;
        const targetHeight = height || imgInfo.height * ratio;

        const canvasId = 'compressCanvas';
        const ctx = uni.createCanvasContext(canvasId);

        ctx.drawImage(src, 0, 0, targetWidth, targetHeight);
        ctx.draw(false, () => {
          setTimeout(() => {
            uni.canvasToTempFilePath({
              canvasId,
              destWidth: targetWidth,
              destHeight: targetHeight,
              fileType: 'jpg',
              quality,
              success(res) {
                resolve(res.tempFilePath);
              },
              fail(err) {
                reject(err);
              }
            });
          }, 200);
        });
      },
      fail: reject
 nUZoEQ   });编程
    #endif

    // H5 平台(用原图或者 compressorjs)
    #ifdef H5
    // 可以在此扩展 compressorjs 逻辑
    resolve(src); // 默认返回原图
    #endif
  });
}

总结 

到此这篇关于uni-app小程序项目中实现前端图片压缩实现方式的文章就介绍到这了,更多相关uni-app前端图片压缩内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于uni-app小程序项目中实现前端图片压缩实现方式(附详细代码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156038

相关文章

JAVA实现Token自动续期机制的示例代码

《JAVA实现Token自动续期机制的示例代码》本文主要介绍了JAVA实现Token自动续期机制的示例代码,通过动态调整会话生命周期平衡安全性与用户体验,解决固定有效期Token带来的风险与不便,感兴... 目录1. 固定有效期Token的内在局限性2. 自动续期机制:兼顾安全与体验的解决方案3. 总结PS

Java实现为PDF设置背景色和背景图片

《Java实现为PDF设置背景色和背景图片》在日常的文档处理中,PDF格式因其稳定性和跨平台兼容性而广受欢迎,本文将深入探讨如何利用Spire.PDFforJava库,以简洁高效的方式为你的PDF文档... 目录库介绍与安装步骤Java 给 PDF 设置背景颜色Java 给 PDF 设置背景图片总结在日常的

C#中通过Response.Headers设置自定义参数的代码示例

《C#中通过Response.Headers设置自定义参数的代码示例》:本文主要介绍C#中通过Response.Headers设置自定义响应头的方法,涵盖基础添加、安全校验、生产实践及调试技巧,强... 目录一、基础设置方法1. 直接添加自定义头2. 批量设置模式二、高级配置技巧1. 安全校验机制2. 类型

Python屏幕抓取和录制的详细代码示例

《Python屏幕抓取和录制的详细代码示例》随着现代计算机性能的提高和网络速度的加快,越来越多的用户需要对他们的屏幕进行录制,:本文主要介绍Python屏幕抓取和录制的相关资料,需要的朋友可以参考... 目录一、常用 python 屏幕抓取库二、pyautogui 截屏示例三、mss 高性能截图四、Pill

使用MapStruct实现Java对象映射的示例代码

《使用MapStruct实现Java对象映射的示例代码》本文主要介绍了使用MapStruct实现Java对象映射的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、什么是 MapStruct?二、实战演练:三步集成 MapStruct第一步:添加 Mave

Java抽象类Abstract Class示例代码详解

《Java抽象类AbstractClass示例代码详解》Java中的抽象类(AbstractClass)是面向对象编程中的重要概念,它通过abstract关键字声明,用于定义一组相关类的公共行为和属... 目录一、抽象类的定义1. 语法格式2. 核心特征二、抽象类的核心用途1. 定义公共接口2. 提供默认实

PyQt6 键盘事件处理的实现及实例代码

《PyQt6键盘事件处理的实现及实例代码》本文主要介绍了PyQt6键盘事件处理的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起... 目录一、键盘事件处理详解1、核心事件处理器2、事件对象 QKeyEvent3、修饰键处理(1)、修饰键类

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

MyCat分库分表的项目实践

《MyCat分库分表的项目实践》分库分表解决大数据量和高并发性能瓶颈,MyCat作为中间件支持分片、读写分离与事务处理,本文就来介绍一下MyCat分库分表的实践,感兴趣的可以了解一下... 目录一、为什么要分库分表?二、分库分表的常见方案三、MyCat简介四、MyCat分库分表深度解析1. 架构原理2. 分