HarmonyOS 鸿蒙Next 分段拍摄中,一段拍摄如何获取图片进行二次处理

发布于 1周前 作者 yibo5220 最后一次编辑是 5天前 来自 鸿蒙OS

分段拍摄中,一段拍摄如何获取图片进行二次处理

photoAccessHelper.getPhotoAccessHelper(context)?.getAssets(fetchOptions, async (err, fetchResult) => {

  if (err) {

    return

  }

  const photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject()

  await photoAccessHelper.MediaAssetManager.requestImageData(context, photoAsset, requestOptions, {

    onDataPrepared(data: ArrayBuffer, map?: Map<string, string>): void {

      if (data) {

      }

    }

  })

})

1、文档上的demo ,这里的 data 是 ArrayBuffer ,是编码过的数据还是 rgba 类型数据?

2、应该怎样获取到图片的宽高?

3、可以转为 pixelmap 吗?


更多关于HarmonyOS 鸿蒙Next 分段拍摄中,一段拍摄如何获取图片进行二次处理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

问题1:ArrayBuffer是未解码的数据,不是RBGA、YUV的像素buffer数据

问题2:可以在转换为pixelmap后,通过getImageInfoSync事件获取图片宽高,

请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-image-V5#getimageinfosync12

问题3:可以转为pixelmap,

请参考demo:

photoBufferCallback: (arrayBuffer: ArrayBuffer) => void = (arrayBuffer: ArrayBuffer) => {

  Logger.info(TAG, 'photoBufferCallback is called');

  let imageSource = image.createImageSource(arrayBuffer);

  imageSource.createPixelMap((err: BusinessError, data: image.PixelMap) => {

    Logger.info(TAG, 'createPixelMap is called');

    this.curPixelMap = data;

  });

};

requestImage(requestImageParams: RequestImageParams): void {

  try {

  class MediaDataHandler implements photoAccessHelper.MediaAssetDataHandler<ArrayBuffer> {

  onDataPrepared(data: ArrayBuffer, map: Map<string, string>): void {

    Logger.info(TAG, 'onDataPrepared begin');

    Logger.info(TAG, `onDataPrepared quality: ${map['quality']}`);

    requestImageParams.callback(data);

    Logger.info(TAG, 'onDataPrepared end');

  }

};

let requestOptions: photoAccessHelper.RequestOptions = {

  deliveryMode: photoAccessHelper.DeliveryMode.BALANCE_MODE,

};

const handler = new MediaDataHandler();

photoAccessHelper.MediaAssetManager.requestImageData(requestImageParams.context, requestImageParams.photoAsset,

  requestOptions, handler);

} catch (error) {

  Logger.error(TAG, `Failed in requestImage, error code: ${error.code}`);

}

}

aboutToAppear() {

  Logger.info(TAG, 'aboutToAppear begin');

  if (this.photoMode === Constants.SUBSECTION_MODE) {

    let curPhotoAsset = GlobalContext.get().getT<photoAccessHelper.PhotoAsset>('photoAsset');

    this.photoUri = curPhotoAsset.uri;

    let requestImageParams: RequestImageParams = {

      context: getContext(),

      photoAsset: curPhotoAsset,

      callback: this.photoBufferCallback

    };

    this.requestImage(requestImageParams);

    Logger.info(TAG, `aboutToAppear photoUri: ${this.photoUri}`);

  } else if (this.photoMode === Constants.SINGLE_STAGE_MODE) {

    this.curPixelMap = GlobalContext.get().getT<image.PixelMap>('photoAsset');

  }

}

具体的分段拍摄可以参考最佳实践:https://developer.huawei.com/consumer/cn/doc/best-practices-V5/bpta-camera-shot2see-V5

更多关于HarmonyOS 鸿蒙Next 分段拍摄中,一段拍摄如何获取图片进行二次处理的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,分段拍摄功能允许用户拍摄多段视频或图片,并在拍摄后进行处理。针对如何在一段拍摄后获取图片进行二次处理的问题,以下是直接操作方法:

  1. 拍摄完成后获取图片

    • 拍摄每一段时,系统会临时保存当前段落的图片或视频文件到指定目录。
    • 使用MediaStore API或者文件管理器访问该目录,获取最新生成的图片文件。
  2. 进行二次处理

    • 加载获取的图片到内存,可以使用BitmapFactoryImageDecoder进行解码。
    • 利用HarmonyOS提供的图像处理API(如ImageEditor)或第三方图像处理库对图片进行编辑、滤镜处理等操作。
    • 处理完成后,可选择保存到原位置或新位置,并更新UI显示。

注意,处理过程中要确保权限管理,确保应用有访问存储和读写文件的权限。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部