Back to Uni App

Compress Image

docs/api/compress-image.md

2.3.314.5 KB
Original Source

uni.compressImage(options) @compressImage

压缩图片

compressImage 兼容性

Web微信小程序AndroidiOSHarmonyOSHarmonyOS(Vapor)
<a style="color:unset;" href="https://vote.dcloud.net.cn/#/?name=uni-app%20x">x</a>4.414.184.254.615.0

参数

名称类型必填默认值兼容性描述
optionsCompressImageOptions-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -

options 的属性描述

名称类型必备默认值兼容性描述
srcstring.ImageURIString-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0图片路径,图片的路径,可以是相对路径、临时文件路径、存储文件路径
qualitynumber-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0压缩质量,范围0~100,数值越小,质量越低,压缩率越高(仅对jpg有效)
rotatenumber-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0旋转度数,范围0~360
compressedHeightnumber-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0压缩后图片的高度,单位为px,若不填写则默认以compressedWidth为准等比缩放
compressedWidthnumber-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0压缩后图片的宽度,单位为px,若不填写则默认以compressedHeight为准等比缩放。
success(callback: CompressImageSuccess) => void-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0接口调用成功的回调函数
fail(callback: CompressImageFail) => void-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0接口调用失败的回调函数
complete(callback: any) => void-Web: x; 微信小程序: -; Android: 4.18; iOS: 4.25; HarmonyOS: 4.61; HarmonyOS(Vapor): 5.0接口调用结束的回调函数(调用成功、失败都会执行)
widthstring-Web: x; 微信小程序: 4.41; Android: -; iOS: -; HarmonyOS: -缩放图片的宽度 已废弃
heightstring-Web: x; 微信小程序: 4.41; Android: -; iOS: -; HarmonyOS: -缩放图片的高度 已废弃

CompressImageSuccess 的属性值 @compressimagesuccess-values

名称类型必备默认值兼容性描述
tempFilePathstring-Web: x; 微信小程序: 4.41; Android: -; iOS: -; HarmonyOS: -压缩后图片的临时文件路径

CompressImageFail 的属性值 @compressimagefail-values

名称类型必备默认值兼容性描述
errCodenumber-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -错误码
errSubjectstring-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -统一错误主题(模块)名称
dataany-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -错误信息中包含的数据
causeError-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -源错误信息,可以包含多个错误,详见SourceError
errMsgstring-Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -

errCode 的属性描述

合法值兼容性描述
1101001Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -用户取消
1101002Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -urls至少包含一张图片地址
1101003Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -文件不存在
1101004Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -图片加载失败
1101005Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -未获取权限
1101006Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -图片或视频保存失败
1101007Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -图片裁剪失败
1101008Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -拍照或录像失败
1101009Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -图片压缩失败
1101010Web: x; 微信小程序: -; Android: -; iOS: -; HarmonyOS: -其他错误

参见

示例

示例为hello uni-app x alpha分支,与最新HBuilderX Alpha版同步。与最新正式版同步的master分支示例另见

该 API 不支持 Web,请运行 hello uni-app x 到 App 平台体验

::: preview

appRedirect https://hellouniappx.dcloud.net.cn/appredirect.html?path=pages/API/compress-image/compress-image

uvue
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <view>
      <page-head :title="title"></page-head>
      <view class="uni-padding-wrap">
        <view class="image-container">
          <image class="image" :src="beforeCompressPath" mode="aspectFit"></image>
          <image class="image" :src="afterCompressPath" mode="aspectFit"></image>
        </view>
        <view class="uni-title">
          <text class="uni-subtitle-text">压缩前图片信息</text>
        </view>
        <text>{{beforeCompressImageInfo}}</text>
        <view class="uni-title">
          <text class="uni-subtitle-text">压缩后图片信息</text>
        </view>
        <text>{{afterCompressImageInfo}}</text>
        <view class="uni-btn-v">
          <button type="primary" @click="chooseImage">从相册中选取待压缩的图片</button>
        </view>
        <view class="uni-btn-v">
          <button type="primary" @click="compressImage">压缩图片</button>
        </view>
      </view>
      <input-data defaultValue="80" title="压缩质量,范围0~100,数值越小,质量越低,压缩率越高(仅对jpg有效)" type="number"
        @confirm="onQualityConfirm"></input-data>
      <input-data title="压缩后图片的宽度,单位px" type="string" @confirm="onCompressedWidthConfirm"></input-data>
      <input-data title="压缩后图片的高度,单位px" type="string" @confirm="onCompressedHeightConfirm"></input-data>
      <input-data defaultValue="0" title="旋转度数,范围0~360" type="number" @confirm="onRotateConfirm"></input-data>
    </view>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  // #ifdef APP-ANDROID
  import FileInputStream from 'java.io.FileInputStream';
  // #endif

  type DataType = {
    imageInfoForTest: UTSJSONObject | null,
    imageSrcForTest: string,
    compressedWidth: number | null,
    compressedHeight: number | null
  }

  const title = ref("compressImage")
  const beforeCompressImageInfo = ref("")
  const afterCompressImageInfo = ref("")
  const beforeCompressPath = ref("")
  const afterCompressPath = ref("")
  const quality = ref(80)
  const rotate = ref(0)
  // 自动化测试
  const data = reactive({
    imageInfoForTest: null,
    imageSrcForTest: '/static/test-image/logo.png',
    compressedWidth: null,
    compressedHeight: null
  } as DataType)

  const compressImage = () => {
    if (beforeCompressPath.value == "") {
      uni.showToast({
        title: "请先选择图片",
        icon: "error"
      });
      return;
    }
    uni.showLoading({
      title: "图片压缩中"
    });
    uni.compressImage({
      src: beforeCompressPath.value,
      quality: quality.value,
      compressedWidth: data.compressedWidth,
      compressedHeight: data.compressedHeight,
      rotate: rotate.value,
      success: (res) => {
        console.log("compressImage success", JSON.stringify(res));
        afterCompressPath.value = res.tempFilePath;
        uni.showToast({
          title: "压缩成功",
          icon: null
        });
        uni.getImageInfo({
          src: res.tempFilePath,
          success: (_res) => {
            afterCompressImageInfo.value = `图片宽度: ${_res.width}\n图片高度: ${_res.height}\n`;
            // #ifdef APP-ANDROID
            const size = new FileInputStream(res.tempFilePath.substring("file://".length)).available() / 1024;
            afterCompressImageInfo.value = afterCompressImageInfo.value.concat(`图片大小: ${size}KB`);
            // #endif
            // #ifdef APP-HARMONY
            const fsm = uni.getFileSystemManager()
            fsm.getFileInfo({
              filePath: res.tempFilePath,
              digestAlgorithm: null,
              success: (res) => {
                afterCompressImageInfo.value = afterCompressImageInfo.value.concat(`图片大小: ${res.size}KB`);
              }
            })
            // #endif
          }
        });
      },
      fail: (err) => {
        uni.showModal({
          title: "压缩图片失败",
          content: JSON.stringify(err),
          showCancel: false
        });
      },
      complete: (_) => {
        uni.hideLoading();
      }
    });
  }

  const chooseImage = () => {
    uni.chooseImage({
      count: 1,
      sizeType: ["original"],
      sourceType: ["album"],
      success: (res) => {
        beforeCompressPath.value = res.tempFilePaths[0];
        uni.getImageInfo({
          src: res.tempFilePaths[0],
          success: (_res) => {
            beforeCompressImageInfo.value = `图片宽度: ${_res.width}\n图片高度: ${_res.height}\n`;
            // #ifdef APP-ANDROID
            const size = new FileInputStream(res.tempFilePaths[0].substring("file://".length)).available() / 1024;
            beforeCompressImageInfo.value = beforeCompressImageInfo.value.concat(`图片大小: ${size}KB`);
            // #endif
            // #ifdef APP-HARMONY
            const fsm = uni.getFileSystemManager()
            fsm.getFileInfo({
              filePath: res.tempFilePaths[0],
              digestAlgorithm: null,
              success: (res) => {
                beforeCompressImageInfo.value = beforeCompressImageInfo.value.concat(`图片大小: ${res.size}KB`);
              },
              fail: (err) => {
                console.log(err);
              }
            })
            // #endif
          }
        });
      }
    });
  }

  const onQualityConfirm = (value: number) => {
    quality.value = value;
  }

  const onCompressedWidthConfirm = (value: string) => {
    data.compressedWidth = parseInt(value);
  }

  const onCompressedHeightConfirm = (value: string) => {
    data.compressedHeight = parseInt(value);
  }

  const onRotateConfirm = (value: number) => {
    rotate.value = value;
  }

  const testCompressImage = () => {
    uni.compressImage({
      src: data.imageSrcForTest,
      quality: 50,
      compressedWidth: 100,
      compressedHeight: 100,
      success: (res) => {
        uni.getImageInfo({
          src: res.tempFilePath,
          success: (_res) => {
            // #ifdef APP-HARMONY || APP-ANDROID
            const fsm = uni.getFileSystemManager()
            fsm.getFileInfo({
              filePath: data.imageSrcForTest,
              digestAlgorithm: null,
              success: (imageInfo) => {
                fsm.getFileInfo({
                  filePath: res.tempFilePath,
                  digestAlgorithm: null,
                  success: (res) => {
                    data.imageInfoForTest = {
                      "width": _res.width,
                      "height": _res.height,
                      "isSizeReduce": res.size < imageInfo.size
                    };
                  }
                })
              }
            })
            // #endif
          }
        });
      },
      fail: (_) => {
        data.imageInfoForTest = null;
      }
    });
  }

  defineExpose({
    data,
    testCompressImage
  })
</script>

<style>
  .image {
    flex: 1;
  }

  .image-container {
    flex-direction: row;
  }
</style>

:::

通用类型

GeneralCallbackResult

名称类型必备默认值兼容性描述
errMsgstring-Web: -; 微信小程序: 4.41; Android: -; iOS: -; HarmonyOS: -错误信息

Tips

  • quality属性
    • Android、iOS平台:仅对JPG格式图片生效,非JPG格式图片quality属性始终为100。
    • HarmonyOS 平台:对 JPG、HEIF 生效,其他为100。详情
  • Android平台仅支持对JPG格式图片进行压缩,其他格式会被压缩为JPG格式。iOS平台支持对JPG和PNG格式进行压缩。
  • HarmonyOS 平台支持对 JPG(透明色将变为黑色)、HEIF、PNG(转为 JPG,透明色将变为黑色) 格式进行压缩。