HarmonyOS 鸿蒙Next如何为沙盒内的照片生成缩略图?

HarmonyOS 鸿蒙Next如何为沙盒内的照片生成缩略图? 如何为沙盒内的照片生成缩略图?
沙盒内的图片,将会显示一个列表在界面上,如果全部显示原图担心性能问题,所以在存放图片时想先生成缩略图,然后在列表里面只显示压缩图。文档里面有PhotoAsset.getThumbnail这个方法,不过好像无法读取应用沙盒内的图片。

2 回复

图片压缩可以参考如下demo:

  1. 初始化图片资源到沙箱
async aboutToAppear(): Promise<void> {
  const resourceManager = getContext(this).resourceManager
  const imageArray = await resourceManager.getMediaContent($r('app.media.100'));

  console.log("yuv_path is:" + path);
  let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);

  fs.write(file.fd, imageArray.buffer).then((writeLen) => {
    console.info("write data to file succeed and size is:" + writeLen);
    fs.closeSync(file);
  }).catch((err: BusinessError) => {
    console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code);
  });
}
  1. 创建pixelMap,并调用压缩方法
// path为已获得的沙箱路径
const imageSource: image.ImageSource = image.createImageSource(path);

// 创建pixelMap
this.pixelMap = await imageSource.createPixelMap(decodingOptions);

console.log("6666661" + this.pixelMap.getPixelBytesNumber());
// 指定压缩宽、高、大小
this.packingDetail(500, 500, 100)
  1. 根据压缩后目标图片宽高计算缩放比 并进行缩放,调用packing方法实现第一次压缩
if (this.pixelMap) {
  Logger.info("zhaohao 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("zhaohao Failed to scale pixelmap.");
      return;
    } else {
      console.log("zhaohao 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("zhaohao in 100 quality data" + data.byteLength)
  this.compressPictures(data, targetPixelSize, 99);
});
  1. 调用递归算法,当压缩后的data ,小于等于压缩目标图片大小时将data写入本地沙箱并结束递归
compressPictures(data?: ArrayBuffer, size?: number, quality?: number): void {
  if (data && size && quality) {
    const currentSize = data.byteLength / 1024
    if (currentSize <= size || quality === 0) {
      console.log("finally quallity is:" + ++quality)
      let file = fs.openSync(path9, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
      fs.write(file.fd, data).then(async (writeLen) => {
        console.info("write data to file succeed2 and size is:" + writeLen);
        fs.closeSync(file);
      }).catch((err: BusinessError) => {
        console.info("write data to file failed1 with error message: " + err.message + ", error code: " + err.code);
      });
      return;
    }
  }
  if (quality) {
    let packOpts: image.PackingOption = { format: "image/jpeg", quality: quality }
    let imagePackerApi = image.createImagePacker();
    imagePackerApi.packing(this.pixelMap, packOpts)
      .then((ret: ArrayBuffer) => {
        // 递归算法,直到压缩到指定大小的data
        if (quality) {
          Logger.info("PACKING66666" + quality)
          return this.compressPictures(ret, size, quality - 1)
        }

      }).catch((err: BusinessError) => {
      console.log(`lbh`)
      return false
    })
  }
}

更多关于HarmonyOS 鸿蒙Next如何为沙盒内的照片生成缩略图?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,为沙盒内的照片生成缩略图,可以通过以下步骤实现,这些步骤不涉及Java或C语言的具体代码实现,而是基于鸿蒙系统提供的API和功能进行描述:

  1. 访问沙盒内的照片: 首先,确保应用具有访问沙盒内照片的权限。这通常需要在应用的权限设置中声明,并在运行时请求用户授权。

  2. 使用鸿蒙系统提供的图像处理能力: 鸿蒙系统提供了丰富的图像处理API,可以利用这些API来加载、缩放和处理图像。对于生成缩略图,可以使用相应的缩放功能将原始图像缩放到合适的尺寸。

  3. 生成缩略图并保存: 在缩放图像后,可以将其保存为缩略图文件。鸿蒙系统支持多种图像格式,因此可以选择合适的格式进行保存。

  4. 注意事项: 在生成缩略图时,要注意内存和性能的优化,避免因为处理大量图像而导致应用卡顿或崩溃。

如果以上步骤无法直接解决你的问题,可能是因为具体的实现细节或系统版本有所不同。此时,你可以参考鸿蒙系统的官方文档或开发者指南,以获取更详细的信息和示例代码。如果问题依旧没法解决请联系官网客服,官网地址是: https://www.itying.com/category-93-b0.html

回到顶部