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.配合图片的裁剪功能,可以完成压缩图片到指定大小的功能

相关推荐
@海~涛1 小时前
鸿蒙OpenHarmony
华为·harmonyos
zhongcx6 小时前
鸿蒙应用示例:镂空效果实现教程
harmonyos
训山7 小时前
【11】纯血鸿蒙HarmonyOS NEXT星河版开发0基础学习笔记-模块化语法与自定义组件
笔记·学习·华为·harmonyos·鸿蒙系统
helloxmg8 小时前
鸿蒙harmonyos next flutter混合开发之开发package
flutter·华为·harmonyos
zhongcx1 天前
鸿蒙应用示例:ArkTS UI框架中的文本缩进技巧
harmonyos
东林知识库1 天前
鸿蒙NEXT开发-自定义构建函数(基于最新api12稳定版)
华为·harmonyos
裴云飞1 天前
鸿蒙性能优化之布局优化
性能优化·harmonyos
zhongcx1 天前
鸿蒙应用示例:ArkTS中设置颜色透明度与颜色渐变方案探讨
harmonyos
PlumCarefree2 天前
mp4(H.265编码)转为本地RTSP流
音视频·harmonyos·h.265
鸿蒙自习室2 天前
鸿蒙网络管理模块04——网络连接管理
华为·harmonyos·鸿蒙·媒体