## 一、图片压缩效果实例
首先,看效果图
根据以上效果图,整理图片信息,简单分析得出下表:
分析可得以下效果结论:
结论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)图片压缩的封装尝试
三、源码(封装压缩图片代码演示)
1.图片压缩方法compressImage()
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.方法调用与传参
.onClick(() => {
this.compressImage(this.imageUri,20)
})
3.前置条件补充
成员变量的设定
@State imageUri: string = '' //图片路径
@State imageSize: number = 0 //图片大小
@State imageDateAdded: number = 0 //图片添加日期