HarmonyOS_Next性能研究与实操1——图片压缩处理功能的特性与封装研究

一、图片压缩效果实例

首先,看效果图

根据以上效果图,整理图片信息,简单分析得出下表

图片 原图大小 压缩后大小 压缩参数(quality) 压缩比(压缩后大小/原图大小)
图1 242.98KB 58.36KB 20 0.24(24%)
图2 58.36KB 45.33KB 10 0.78(78%)
图3 1401.11KB 31.73KB 10 0.23(23%)
图4 1401.11KB 44.08KB 20 0.32(32%)

分析可得以下效果结论

结论1:图片经过一次压缩后再压缩,压缩效果比会大幅度减小

(本处采用的是图1与图2压缩比对比的结果,但本次测试存在客观不足,即压缩参数没有设定一致,实际效果有待另外精确控制变量测试)

结论2:图片大小不同,压缩参数相同,压缩后的大小不一定能准确按比例推定

(如图2和图3案例的对照,同样是压缩参数10,但图2小图压缩处理的大小反而比图3大图压缩出来的大,压缩比也达到0.78与0.23的显著差距)

结论3:图片大小相同,压缩参数不同,压缩参数增大后,压缩的性能/效率可能会有降低

(图3、图4的案例,压缩参数从10调至20,压缩比从0.23升值0.32,压缩效率降低)

二、相关代码说明

(1)图片压缩核心过程与核心API

划蓝部分为图片压缩的核心过程

其中,图片压缩核心API:imagePacker.packing()

(2)图片压缩的封装尝试

在Button按钮的点击事件中调用封装好的图片压缩功能,其中可自主设定传入的图片路径、压缩参数(quality)

三、源码(初步封装后)

1.图片压缩方法compressImage()

typescript 复制代码
  // 图片压缩
  async compressImage(uri:string,qualityParam:number){
    // 先获取相册中的图片
    await this.example()
​
    // 根据 uri 打开图片文件
    const file = fileIo.openSync(uri)
    // 创建图片源实例(根据文件 fd 创建)
    const imageSource = image.createImageSource(file.fd)
    // 图片打包器(主要用于图片压缩)
    const imagePacker = image.createImagePacker()
    // 图片压缩核心 API: imagePacker.packing()
    // arrayBuffer 二进制文件数据流信息,quality 控制压缩的质量(值越大图片越大,值小->图片文件小)
    const arrayBuffer = await imagePacker.packing(imageSource, {format:'image/jpeg',quality:qualityParam})
    // AlertDialog.show({ message:JSON.stringify({ arrayBufferByteLength: arrayBuffer.byteLength },null,2) })
    AlertDialog.show({message:'压缩后大小(单位字节):' + formatByteLength(arrayBuffer.byteLength)})
    // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    const phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext())
    // 创建新的图片资源,返回图片资源的 uri
    const assetUri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE,'jpg')
    // 根据Uri打开文件,注意:由于需要写入图片 arrayBuffer,所以在打开时,还需要设置打开模式为可写 READ_WRITE
    const assetFile = fileIo.openSync(assetUri, fileIo.OpenMode.WRITE_ONLY)
    // 往打开的文件写入arrayBuffer
    fileIo.writeSync(assetFile.fd,arrayBuffer)
    // 写完后,主动关闭文件
    fileIo.close(assetFile.fd)
  }

2.方法调用与传参

kotlin 复制代码
          Button('压缩图片')
            .onClick(() => {
              this.compressImage(this.imageUri,20)
            })

3.前置条件补充

成员变量的设定

less 复制代码
  // 图片相关变量
  @State imageUri: string = '' //图片路径
  @State imageSize: number = 0 //图片大小
  @State imageDateAdded: number = 0 //图片添加日期

四、思路拓展

1.可以考虑增加用户自主选择图片压缩大小的调适功能

方案一:用户可以选择图片压缩后的大小:小、中、大,三种规格

方案二:用户可以自由设定压缩大小的比例,自由设定quality参数,可以考虑的实现方法有多种,如

(1)TextInput输出压缩参数(quality)

(2)使用拉动条,在拉动的同时调整压缩参数(可以实时显示预计压缩后的大小)

2.配合图片的裁剪功能,可以完成压缩图片到指定大小的功能

相关推荐
Magic-ZYJ6 小时前
HarmonyOS Release 构建安全:ArkGuard 混淆、签名配置与秘密管理
安全·华为·harmonyos·移动应用开发·心晴手记
见山是山-见水是水8 小时前
拆解HarmonyOS网络请求适配:原生鸿蒙页面的实现路径与调试方法
华为·harmonyos
m0_749690238 小时前
【寻迹校园 HarmonyOS NEXT 实战 36】深色模式不是反色:用语义 Token 管理品牌色与状态色
harmonyos·arkts·深色模式·ui设计·主题设计
lqj_本人9 小时前
鸿蒙跨端实战_QT后台切换导致OpenGLES上下文丢失:黑屏自救指南
qt·华为·harmonyos
OH_TPC10 小时前
HarmonyOS APP开发---“数据眼“健康追踪App,需要用到这个库
华为·harmonyos·鸿蒙
lilian23311 小时前
Harmony os 技术实战|拼豆制图49:五组分类视觉规则如何收口成一张配置表
华为·harmonyos
2501_9197490312 小时前
华为鸿蒙免费决策APP—小羊挠头
华为·harmonyos·鸿蒙
m0_7496902312 小时前
【寻迹校园 HarmonyOS NEXT 实战 37】一套 ArkUI 适配四档宽度:sm、md、lg、xl 响应式 Shell 实战
华为·harmonyos·arkui·navigation·响应式布局·多设备适配
RisunJan14 小时前
HarmonyOS 架构精读:从系统分层到应用模型
华为·架构·harmonyos
见山是山-见水是水14 小时前
从需求到页面:鸿蒙原生 Ability 与 ArkTS 交互的 ArkTS 原生实现
华为·harmonyos