#鸿蒙通关秘籍#如何在HarmonyOS中使用packing和scale方法有效压缩图片?

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
GPU风中琴

在HarmonyOS中使用packing和scale方法压缩图片,可以按照以下步骤进行:

  1. 创建ImagePacker对象以便图像编码,并定义图片质量参数quality为0。
  2. 利用packing操作检查最小可压缩大小是否符合目标。如果合适,使用二分法寻找最接近目标的质量参数进行压缩。
  3. 如果packing的最小大小不合适,转而使用scale缩放图片,调整缩放比例直到满足大小要求。
  4. 压缩后,通过文件操作API保存图片到指定路径。

以下提供详细代码:

let imagePackerApi = image.createImagePacker();
let imageQuality = 0;
let packOpts = { format: "image/jpeg", quality: imageQuality };
let compressedImageData = await imagePackerApi.packing(sourcePixelMap, packOpts);
let maxCompressedImageByte = maxCompressedImageSize * BYTE_CONVERSION;
if (maxCompressedImageByte > compressedImageData.byteLength) {
  compressedImageData = await packingImage(compressedImageData, sourcePixelMap, imageQuality, maxCompressedImageByte);
} else {
  let imageScale = 1;
  let reduceScale = 0.4;
  while (compressedImageData.byteLength > maxCompressedImageByte) {
    if (imageScale > 0) {
      imageScale -= reduceScale;
      await sourcePixelMap.scale(imageScale, imageScale);
      compressedImageData = await packing(sourcePixelMap, imageQuality);
    } else {
      break;
    }
  }
}

let context = getContext();
let compressedImageUri = context.filesDir + '/' + 'afterCompressiona.jpeg';
let file = fs.openSync(compressedImageUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file.fd, compressedImageData);
fs.closeSync(file);
let compressedImageInfo = { imageUri: compressedImageUri, imageByteLength: compressedImageData.byteLength };

通过上述步骤和代码,可以在HarmonyOS环境中有效地压缩图片至目标大小。

分享
微博
QQ
微信
回复
1天前
相关问题
API 9 ETS如何进行压缩图片
327浏览 • 1回复 待解决