HarmonyOS 图片压缩问题

从photoPicker选了一张图片后,得到一个url是: file://media/Photo/6/IMG_1716949539_005/screenshot_20240529_102359.jpg想将它压缩到100k以内,并存储在沙盒目录下,要怎么处理?

HarmonyOS
2024-12-19 16:41:03
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
fox280

目前没有接口直接实现,不支持将图片PixelMap压缩到指定大小,规避方案可以通过如下循环模式实现:

photoSelect() {
  const photoSelectOptions = new picker.PhotoSelectOptions();
  photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
  photoSelectOptions.maxSelectNumber = 5

  const photoPicker = new picker.PhotoViewPicker();
  photoPicker.select(photoSelectOptions)
    .then(async (photoSelectResult) => {
      let uri = photoSelectResult.photoUris[0]
      let file = fs.openSync(uri, fs.OpenMode.READ_ONLY)
      this.compressPictures(file)

    })
}

compressPictures(file: fs.File, data?: ArrayBuffer, size: number = 30, quality: number = 99): void | ArrayBuffer {
  if (data) {
    const currentSize = data.byteLength / 1024
    if (currentSize <= size || quality === 1) {
      return data
    }
  }
  const imagePackerApi = image.createImagePacker();
  const imageSourceApi = image.createImageSource(file.fd);
  let packOpts: image.PackingOption = { format: "image/jpeg", quality: quality }

  imagePackerApi.packing(imageSourceApi, packOpts)
    .then((ret: ArrayBuffer) => {
      if (data && ret.byteLength === data.byteLength) {
        return ret
      }
      return this.compressPictures(file, ret, size, quality-1)
    }).catch((err: BusinessError) => {
    console.log(`111`)
    return false
  })
}

// path为已获得的沙箱路径
const imageSource: image.ImageSource = image.createImageSource(path);
let decodingOptions: image.DecodingOptions = {
  editable: true, // 是否可编辑。当取值为false时,图片不可二次编辑,如crop等操作将失败。
  desiredPixelFormat: 3, // 解码的像素格式。3表示RGBA_8888。
}
//创建pixelMap
this.pixelMap = await imageSource.createPixelMap(decodingOptions);
console.log("6666661" + this.pixelMap.getPixelBytesNumber());
//指定压缩宽、高、大小
this.packingDetail(500, 500, 100)

if (this.pixelMap) {
  Logger.info("tag before scaling pixelmap." + this.pixelMap.getPixelBytesNumber());
  let imageInfo = await this.pixelMap.getImageInfo();
  let a = this.pixelMap
  //计算压缩比
  let scaleX: number = targetWidth / imageInfo.size.width;
  let scaleY: number = targetHeight / imageInfo.size.height;
  this.pixelMap.scale(scaleX, scaleY, (err: BusinessError) => {
    if (err) {
      console.error("tag Failed to scale pixelmap.");
      return;
    } else {
      console.log("tag in scaling pixelmap." + a.getPixelBytesNumber());
    }
  });
}
let imagePackerApi = image.createImagePacker();
let packOpts: image.PackingOption = { format: "image/jpeg", quality: 100 };
imagePackerApi.packing(this.pixelMap, packOpts).then((data: ArrayBuffer) => {
  Logger.info("tag in 100 quality data" + data.byteLength)
  this.compressPictures(data, targetPixelSize, 99);
})

2、这个let packOpts: image.PackingOption = { format: “image/jpeg”, quality: quality },表示图片打包选项。‘format’ 是目标格式,当前只支持jpg、webp 和 png。

3、视频文件的压缩需要另外的处理方法,可以使用videoCompressor,这是一款高性能的视频压缩三方库,相关参考代码:https://gitee.com/openharmony-sig/ohos_videocompressor

分享
微博
QQ
微信
回复
2024-12-19 18:32:04
相关问题
图片压缩尺寸和大小问题
810浏览 • 1回复 待解决
HarmonyOS 图片压缩失败
350浏览 • 1回复 待解决
HarmonyOS 图片压缩工具
326浏览 • 1回复 待解决
HarmonyOS 如何压缩本地图片
477浏览 • 1回复 待解决
HarmonyOS图片压缩不到指定大小
1048浏览 • 1回复 待解决
HarmonyOS ZIP压缩问题
303浏览 • 1回复 待解决
HarmonyOS next 压缩问题
817浏览 • 1回复 待解决
HarmonyOS 图片压缩图片转base64
724浏览 • 1回复 待解决
HarmonyOS 图片的加载与压缩服务
543浏览 • 1回复 待解决
HarmonyOS 怎么对图片进行压缩上传
470浏览 • 1回复 待解决
flutter适配HarmonyOS图片压缩的库
559浏览 • 1回复 待解决
HarmonyOS 图片的加载与压缩服务?
516浏览 • 0回复 待解决
HarmonyOS 如何压缩图片之后再上传?
292浏览 • 1回复 待解决
HarmonyOS 图片、视频文件压缩的demo
139浏览 • 1回复 待解决
使用图片压缩API的参数影响
1051浏览 • 1回复 待解决
HarmonyOS 相册选择后压缩图片大小
246浏览 • 1回复 待解决
图片压缩指定宽高和限制大小
1343浏览 • 1回复 待解决