一、图片压缩效果实例
首先,看效果图

根据以上效果图,整理图片信息,简单分析得出下表
图片 | 原图大小 | 压缩后大小 | 压缩参数(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)使用拉动条,在拉动的同时调整压缩参数(可以实时显示预计压缩后的大小)