HarmonyOS 鸿蒙Next 双路预览的component.byteBuffer创建PixelMap失败

HarmonyOS 鸿蒙Next 双路预览的component.byteBuffer创建PixelMap失败

receiver.on('imageArrival', () => {
  receiver.readNextImage((err: BusinessError, nextImage: image.Image) => {
    if (err || nextImage === undefined) {
      console.error('readNextImage failed');
      return;
    }
    nextImage.getComponent(image.ComponentType.JPEG, async (err: BusinessError, imgComponent: image.Component) => {
      if (err || imgComponent === undefined) {
        console.error('getComponent failed');
      }
      if (imgComponent && imgComponent.byteBuffer as ArrayBuffer) {
        // do something...
        // 创建ImageSource实例
        const imageSource: image.ImageSource = image.createImageSource(imgComponent.byteBuffer);
        const decodingOptions: image.DecodingOptions = {
          editable: true, // 是否可编辑。当取值为false时,图片不可二次编辑,如crop等操作将失败。
          desiredPixelFormat: 3, // 解码的像素格式。3表示RGBA_8888。
        }

        // 创建pixelMap
        let originalPixelMap:image.PixelMap = await imageSource.createPixelMap(decodingOptions); // 这里会报错 Create PixelMap error
      } else {
        console.error('byteBuffer is null');
      }
      nextImage.release();
    })
  })
})

更多关于HarmonyOS 鸿蒙Next 双路预览的component.byteBuffer创建PixelMap失败的实战教程也可以访问 https://www.itying.com/category-93-b0.html

2 回复

看看下面Demo,createImageSource和createPixelMapSync参数,savePictureJpg可以不用关注:

try {
 this.mReceiver = image.createImageReceiver({width: this.previewProfileObj.size.width, height: this.previewProfileObj.size.height},
   image.ImageFormat.JPEG, 8);
 // 接受图像帧
 this.mReceiver.on('imageArrival', (): void => {
   this.mReceiver.readNextImage((errCode: BusinessError, imageObj: image.Image): void => {
     console.info('readNextImage start');
     if (errCode || imageObj === undefined) {
       console.error('readNextImage failed');
       return;
     }
     imageObj.getComponent(image.ComponentType.JPEG, (errCode: BusinessError, component: image.Component): void => {
       console.info(`err: ${JSON.stringify(errCode)}`);
       if (errCode || component === undefined) {
         console.info('getComponent failed');
         return;
       }
       let buffer: ArrayBuffer;
       if (component.byteBuffer as ArrayBuffer) {
         buffer = component.byteBuffer;
         let imageSource = image.createImageSource(buffer, sourceOptions);
         let p = imageSource.createPixelMapSync(decodingOptions);
         this.savePictureJpg(buffer, GlobalContext.getContext().cacheDir + "/test.jpg");
       } else {
         console.error('component byteBuffer is undefined');
       }
     });
   });
 });
} catch (error) {
 let err = error as BusinessError;
 console.error(`savePicture err: ${JSON.stringify(err)}`);
}
let decodingOptions : image.DecodingOptions = {
 editable: true,
 desiredPixelFormat: 3,
}

let sourceOptions: image.SourceOptions = {
 sourceDensity: 120,
 sourcePixelFormat: 8,
 sourceSize: {
   height: 1080,
   width: 1920
 }
}

更多关于HarmonyOS 鸿蒙Next 双路预览的component.byteBuffer创建PixelMap失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对您提到的HarmonyOS鸿蒙Next双路预览中component.byteBuffer创建PixelMap失败的问题,这通常涉及到底层图像数据处理和内存管理。以下是一些可能的原因及检查方向:

  1. ByteBuffer格式与PixelMap不匹配:确保您的ByteBuffer数据格式(如颜色空间、位深度等)与PixelMap构造函数所期望的格式一致。不匹配的格式会导致创建失败。

  2. 内存权限或分配问题:检查您的应用是否有足够的权限访问和分配所需内存。在鸿蒙系统中,内存管理较为严格,不当的内存使用可能导致操作失败。

  3. 数据损坏或未正确初始化ByteBuffer中的数据在传递给PixelMap前必须完整且正确初始化。任何数据损坏或未初始化的部分都可能导致创建失败。

  4. API或系统限制:确认您使用的API版本是否支持当前操作,以及是否存在系统级别的限制或已知问题。

  5. 日志与调试:查看系统日志以获取更详细的错误信息,这有助于定位问题。

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

回到顶部