HarmonyOS 相机双路预览,通过ImageReceiver实时获取预览图像的数据操作

readNextImage获得的image,再通过getComponent得到imgComponent: image.Component。

获取到ArrayBuffer无论是图片写入本地图片文件,还是创建图片源实例ImageSource对象调用对应方法均异常。

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

相机预览流返回的是NV21格式数据需要将options中的sourcePixelFormat设置为8(NV21)。

用如下方法试一下:可以把pixelMap保存到相册。

// 通过Surface进行数据传递,通过ImageReceiver的surface获取预览图像。
async onImageArrival(receiver: image.ImageReceiver): Promise<void> {
  receiver.on('imageArrival', () => {
  receiver.readNextImage(async (err, nextImage: image.Image) => {
  //console.info(`enter CameraDemo imageArrival, nextImage: ${JSON.stringify(nextImage)}`)
  if (err || nextImage === undefined) {
  console.error(`CameraDemo imageArrival error, error is ${JSON.stringify(err)} or nextImage is undefined`)
return;
}
nextImage.getComponent(image.ComponentType.JPEG, async (err, imgComponent: image.Component) => {
  if (err || imgComponent === undefined) {
    console.error(`CameraDemo getComponent error, error is ${JSON.stringify(err)} or imgComponent is undefined`)
    return;
  }
  if (imgComponent.byteBuffer as ArrayBuffer) {
    let sourceOptions: image.SourceOptions = {
      sourceDensity: 0,
      sourcePixelFormat: image.PixelMapFormat.NV21, // NV21
      sourceSize: this.imageSize
    }
    let imageSource: image.ImageSource = image.createImageSource(imgComponent.byteBuffer, sourceOptions);
    let opts: image.InitializationOptions = {
      editable: false,
      pixelFormat: image.PixelMapFormat.NV21,
      size: this.imageSize
    }
    let pixelMap = await imageSource.createPixelMap(opts);
    await pixelMap.rotate(90.0);
    this.pixelMap = pixelMap;
    await imageSource.release();
  } else {
    return;
  }
  nextImage.release()
})
})
})
}
分享
微博
QQ
微信
回复
1天前
相关问题
如何实现预览+录制功能
1080浏览 • 1回复 待解决
如何连续获取相机预览数据
745浏览 • 1回复 待解决
如何获取前置摄像头预览图像
2436浏览 • 1回复 待解决
有没有实时相机预览结合OCR识别的demo
1753浏览 • 1回复 待解决
DevEco Studio预览器支持实时预览吗?
6337浏览 • 1回复 待解决
camera 获取预览数据
1850浏览 • 1回复 待解决