HarmonyOS 鸿蒙Next pixelMap.crop 后如何获取到YUV buffer

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next pixelMap.crop 后如何获取到YUV buffer

pixelMap.crop({ x: 0, y: 0, size: { height: 640, width: 832 } }, () => { // 这里获取到裁剪后的pixelMap ,如何获取到对应YUV格式的buffer? })

对相机流进行pixelMap.crop后,如何获取到YUV buffer? ,imagePackerApi.packing 似乎不支持YUV(NV21)格式

2 回复

pixelMap.crop的回调函数一般是用于接收裁剪失败的错误的,无法获取yuv格式数据。

this.pixelMap?.crop({ x: 150, y: 100, size: { height: 100, width: 100 } }, (err: BusinessError) => {
  if (err) {
    console.error(`Failed to crop pixelmap. code is ${err.code}, message is ${err.message}`);
    return;
  } else {
    console.info("Succeeded in cropping pixelmap.");
  }
})

获取yuv数据可以参考:

async onImageArrival(receiver: image.ImageReceiver): Promise<void> {
  receiver.on('imageArrival', () => {
    //保存文件
    receiver.readLatestImage((err, nextImage: image.Image) => {
      if (err || nextImage === undefined) {
        return;
      }
      nextImage.getComponent(image.ComponentType.JPEG, async (err, imgComponent: image.Component) => {
        if (err || imgComponent === undefined) {
          return;
        }
        if (imgComponent.byteBuffer as ArrayBuffer) {
          let path: string = getContext().filesDir + "/image.yuv";
          let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
          let opt: WriteOptions = {
            // 多出2048字节数据
            length: imgComponent.byteBuffer.byteLength - 2048
          }
          fs.write(file.fd, imgComponent.byteBuffer, opt).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);
          });
        } else {
          return;
        }
        nextImage.release();
      })
    })
  })
}

更多关于HarmonyOS 鸿蒙Next pixelMap.crop 后如何获取到YUV buffer的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS中,当你对PixelMap对象使用crop方法裁剪图像后,要获取到YUV buffer,通常需要经过以下几个步骤,但需要注意的是,HarmonyOS的API设计可能与Android有所不同,且直接获取YUV buffer的操作可能较为底层或需要特定权限和配置。

  1. 确保PixelMap格式支持:首先,需要确认裁剪后的PixelMap是否支持转换为YUV格式。通常,PixelMap默认可能是RGB或ARGB格式,需要转换为YUV格式。

  2. 使用ImageUtils或类似工具:HarmonyOS可能提供了类似Android的ImageUtils工具类(尽管名称可能不同),用于像素格式的转换。需要查找相关API文档,确认是否有直接转换PixelMap到YUV buffer的方法。

  3. 手动转换:如果没有直接的API支持,可能需要手动遍历PixelMap的像素数据,进行RGB到YUV的转换。这涉及到复杂的数学运算,通常不推荐非专业开发者尝试。

  4. 注意内存管理和性能:处理YUV数据通常涉及大量内存操作,需要特别注意内存泄漏和性能问题。

由于HarmonyOS的具体API和实现细节可能随时间变化,以上步骤仅为一般性指导。如果直接操作PixelMap获取YUV buffer的方法不明确,建议查阅最新的HarmonyOS开发者文档或示例代码。

如果问题依旧没法解决请联系官网客服,官网地址是

回到顶部