uni-app ios 图片选择原图压缩设置宽高后,图片会旋转导致变形

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

uni-app ios 图片选择原图压缩设置宽高后,图片会旋转导致变形

uni.compressImage 设置宽高后图片旋转导致图片变形(ios 选择原图),获取原图片 高大于宽,但是 不设置宽高,压缩后获取图片 是 宽>高,导致uni.compressImage设置宽高后,图片变形

开发环境 版本号 项目创建方式
iOS 未知 未知
2 回复

如果uni.compressImage有问题,建议使用compressorjs压缩,放弃uni封装的 npm install compressorjs --save


在uni-app中处理iOS设备上图片选择后压缩并设置宽高时可能出现的旋转变形问题,可以通过获取图片的EXIF信息,并根据该信息对图片进行正确的旋转处理,然后再进行压缩和尺寸调整。以下是一个示例代码,展示了如何在uni-app中实现这一过程。

首先,需要安装一个用于处理EXIF信息的库,例如exif-js。可以通过在HBuilderX中直接下载该库并引入,或者使用npm(如果项目配置支持)。

<!-- 在index.html中引入exif-js库 -->
<script src="path/to/exif-js"></script>

接下来,在uni-app的页面脚本中处理图片选择、EXIF读取、旋转校正以及压缩调整尺寸的逻辑:

export default {
  methods: {
    chooseAndProcessImage() {
      uni.chooseImage({
        count: 1,
        sourceType: ['album', 'camera'],
        success: (res) => {
          const filePath = res.tempFilePaths[0];
          this.loadImageAndProcess(filePath);
        }
      });
    },
    loadImageAndProcess(filePath) {
      uni.getImageInfo({
        src: filePath,
        success: (imageInfo) => {
          const orientation = EXIF.getTag(this.getImageData(filePath), 'Orientation');
          const canvasId = 'imageCanvas';
          const ctx = uni.createCanvasContext(canvasId);

          // 根据EXIF的Orientation调整canvas的drawImage参数
          let drawWidth = imageInfo.width;
          let drawHeight = imageInfo.height;
          let drawX = 0;
          let drawY = 0;
          if (orientation > 4) {
            drawWidth = imageInfo.height;
            drawHeight = imageInfo.width;
          }
          switch (orientation) {
            case 2: drawX = drawWidth; drawY = 0; drawWidth = -drawWidth; break;
            case 3: drawX = drawWidth; drawY = drawHeight; drawWidth = -drawWidth; drawHeight = -drawHeight; break;
            case 4: drawY = drawHeight; drawHeight = -drawHeight; break;
            case 5: drawX = 0; drawY = drawHeight; drawHeight = -drawHeight; break;
            case 6: drawX = 0; drawY = 0; drawWidth = -drawWidth; break;
            case 7: drawX = drawWidth; drawY = 0; break;
            case 8: drawY = 0; break;
          }

          // 绘制到canvas上,并导出为指定宽高的图片
          ctx.drawImage(filePath, drawX, drawY, drawWidth, drawHeight, 0, 0, 300, 300); // 假设目标宽高为300x300
          ctx.draw(false, () => {
            uni.canvasToTempFilePath({
              canvasId,
              destWidth: 300,
              destHeight: 300,
              success: (res) => {
                console.log('Processed image path:', res.tempFilePath);
              }
            });
          });
        }
      });
    },
    getImageData(filePath) {
      // 这里需要实现一个方法,将filePath转换为Blob或ArrayBuffer,用于EXIF.getData
      // 由于uni-app的限制,可能需要通过服务器端代理或插件来实现这一步
      // 此处省略具体实现,仅作为示例
      return null; // 占位符
    }
  }
}

注意:由于uni-app直接处理文件读取和Blob数据的能力有限,getImageData方法的实现可能需要借助原生插件或服务器端代理来完成。此外,上述代码示例中的EXIF处理部分假设EXIF.getTagEXIF.getData方法可以直接使用,但在实际环境中可能需要根据具体的EXIF库进行调整。

回到顶部