一般在做APP 头像、背景等功能的时候,调用系统选择图片功能,上传给服务端,图片都非常的大,相机像素越高图片就越大。一般都有几 M,甚至 10M以上的,这个时候一般需要压缩图片,变成非常小的图片,如果不压缩图片,将几 M 的图片作为头像,用户访问个头像发现下载要个 1-2 秒,就体验非常差。
压缩图片可以服务端压缩,同时也可以客户端直接压缩好再上传。
鸿蒙自带提供了官方 API 压缩图片。
压缩图片
官方提供了 2 类接口,一类是读取源文件叫做解码,一类是将解码源文件处理成别的格式或其他叫做编码。压缩图片就利用上面两个接口即可完成。
下面是封装好的方法:
/**
* 压缩图片
* @param buffer 二进制
* @param contentType image/jpeg 保存后的文件格式
* @param compressionRatio 1 就是 100%, 0.5 就是50%
* @returns
*/
export async function compression(buffer: ArrayBuffer, contentType: string, compressionRatio: number = 1) {
// 这里判断 1,是因为压缩的时候传了 100%,也会丢失一点精度,所以直接返回了。
if (compressionRatio == 1) {
return buffer
}
const imageSource: image.ImageSource = image.createImageSource(buffer);
const imagePackerApi = image.createImagePacker();
const bf = await imagePackerApi.packing(imageSource, { format: contentType, quality: compressionRatio * 100 })
return bf
}
至于如何读取源文件变成buffer,可以参考之前的文章《鸿蒙/Harmony | 开发日志》选择文件或拍照功能》