HarmonyOS 鸿蒙Next 分段拍摄中,一段拍摄如何获取图片进行二次处理
分段拍摄中,一段拍摄如何获取图片进行二次处理
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
问题1:ArrayBuffer是未解码的数据,不是RBGA、YUV的像素buffer数据
问题2:可以在转换为pixelmap后,通过getImageInfoSync事件获取图片宽高,
问题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系统中,分段拍摄功能允许用户拍摄多段视频或图片,并在拍摄后进行处理。针对如何在一段拍摄后获取图片进行二次处理的问题,以下是直接操作方法:
-
拍摄完成后获取图片:
- 拍摄每一段时,系统会临时保存当前段落的图片或视频文件到指定目录。
- 使用
MediaStore
API或者文件管理器访问该目录,获取最新生成的图片文件。
-
进行二次处理:
- 加载获取的图片到内存,可以使用
BitmapFactory
或ImageDecoder
进行解码。 - 利用HarmonyOS提供的图像处理API(如
ImageEditor
)或第三方图像处理库对图片进行编辑、滤镜处理等操作。 - 处理完成后,可选择保存到原位置或新位置,并更新UI显示。
- 加载获取的图片到内存,可以使用
注意,处理过程中要确保权限管理,确保应用有访问存储和读写文件的权限。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。