uni-app H5图片压缩上传以及旋转

发布于 1周前 作者 wuwangju 来自 Uni-App

uni-app H5图片压缩上传以及旋转

如何解决H5图片上传时照片被旋转以及如何等比压缩图片,图片不变形!

信息类型 详情
开发环境
版本号
项目创建方式
3 回复

查看详细 目前只有这个 如果想旋转的话使用 canvas 的setTransform()方法设置中心点 rotate() 旋转


如果是H5可在直接用H5的插件,网上多的是。

在处理uni-app中的H5图片压缩上传以及旋转功能时,可以利用HTML5的Canvas API来实现。下面是一个简要的代码示例,展示了如何压缩图片、旋转图片并上传到服务器。

1. 引入必要的库

pages/index/index.vue中,引入必要的库(如果需要,可以使用uni.chooseImage来选择图片)。

<template>
  <view>
    <button @click="chooseImage">选择图片</button>
    <canvas canvas-id="myCanvas" style="display: none;"></canvas>
    <image :src="compressedImageSrc" v-if="compressedImageSrc"></image>
  </view>
</template>

<script>
export default {
  data() {
    return {
      compressedImageSrc: ''
    };
  },
  methods: {
    chooseImage() {
      uni.chooseImage({
        count: 1,
        success: (res) => {
          const filePath = res.tempFilePaths[0];
          this.compressAndRotateImage(filePath, 90).then((base64) => {
            this.compressedImageSrc = base64;
            // 此处可以添加上传逻辑
            this.uploadImage(base64);
          });
        }
      });
    },
    compressAndRotateImage(filePath, angle) {
      return new Promise((resolve, reject) => {
        uni.getImageInfo({
          src: filePath,
          success: (imageInfo) => {
            const ctx = uni.createCanvasContext('myCanvas', this);
            const { width, height } = imageInfo;
            const canvasWidth = width / 2; // 压缩比例,这里简单设置为原宽高的一半
            const canvasHeight = height / 2;
            ctx.drawImage(filePath, 0, 0, canvasWidth, canvasHeight, 0, 0, width, height);
            ctx.rotate((angle * Math.PI) / 180);
            ctx.draw(false, () => {
              uni.canvasToTempFilePath({
                canvasId: 'myCanvas',
                destWidth: width,
                destHeight: height,
                success: (res) => {
                  uni.getFileSystemManager().readFile({
                    filePath: res.tempFilePath,
                    encoding: 'base64',
                    success: (data) => {
                      resolve(`data:image/png;base64,${data.data}`);
                    },
                    fail: reject
                  });
                },
                fail: reject
              });
            });
          },
          fail: reject
        });
      });
    },
    uploadImage(base64) {
      // 使用uni.uploadFile或其他方法上传base64编码的图片到服务器
    }
  }
};
</script>

2. 解释代码

  • chooseImage方法:调用uni.chooseImage选择图片,并调用compressAndRotateImage方法进行压缩和旋转。
  • compressAndRotateImage方法:获取图片信息,创建Canvas上下文,绘制图片,旋转Canvas,然后导出压缩并旋转后的图片为base64编码。
  • uploadImage方法:这里仅是一个占位符,你可以使用uni.uploadFile或其他方法将base64编码的图片上传到服务器。

注意:

  • 上述代码示例仅展示了核心逻辑,实际应用中可能需要根据具体需求调整。
  • 图片压缩比例可以根据需要调整,这里简单设置为原宽高的一半。
  • 旋转角度可以根据需求调整,示例中旋转了90度。
回到顶部