HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题

HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题

【问题现象】

自定义相机,使用createPixelMapFromSurface创建XComponent的截图和自定义扫码预览流XComponent中显示的不一致,createPixelMapFromSurface创建的截图不完整。

点击放大

【背景知识】

【定位思路】

(1)查看自定义扫码中预览流的宽高比,像素比是widthheight为23361080。

点击放大

(2)如果XComponent的宽高是根据自定的大小设置的,自定扫码返回的预览流中size大小和XComponent实际的size大小是不一致的。比如现在使用XComponent的宽是1216px、高是1478px,但是其实扫码预览流实际宽为2384px、高为1080px,XComponent对预览流进行了拉伸处理。

(3)这个时候如果image.createPixelMapFromSurface截图的image.Region设置为XComponent的宽高,截图就只会截取部分相机返回的预览流,因此推断像素不对截取的图片就不对。

问题代码如下:

let region: image.Region = { x: 0, y: 0, size: { height:1478, width: 1216 } }

【解决方案】

通过相机预览回调的宽高设置createPixelMapFromSurfaceimage.Region

(1)获取自定义扫码界面回调的相机预览流。

代码示例如下:

private frameCallback: AsyncCallback<customScan.ScanFrame> =
    async (error: BusinessError, scanFrame: customScan.ScanFrame) => {
      if (error) {
        return;
      } else {
        this.ImageHeight= scanFrame.height
        this.ImageWidth= scanFrame.width
      }
    }

(2)获取相机预览流的宽高后设置image.Region的宽高。

代码示例如下:

let region: image.Region ={ x: 0, y: 0, size: { height: this.ImageHeight, width: this.ImageWidth } }
image.createPixelMapFromSurface(this.surfaceId, region).then(async (pixmap: image.PixelMap) => {
console.info('Succeeded in creating pixelmap from Surface');
      await pixmap.rotate(90)
      let base64Str = await ImageUtil.pixelMapToBase64Str(pixmap)
      if (base64Str != undefined) {
           ToastUtil.showToast('截图成功')
           this.imageList.push(base64Str)
           }
       }).catch((error: BusinessError) => {
           ToastUtil.showToast('截图失败')
           console.error(`Failed to create pixelmap. code is ${error.code}, message is ${error.message}`);
 });

使用相机预览流设置宽高后返回的截图:

点击放大


更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,自定义扫码界面创建时出现截图与预览流不一致的问题

在HarmonyOS鸿蒙Next中,自定义扫码界面创建时出现截图与预览流不一致的问题,通常是由于UI渲染与预览流的帧率不同步导致的。可以通过以下步骤解决:

  1. 同步帧率:确保UI渲染的帧率与相机预览流的帧率一致。可以通过CameraConfig.Builder设置预览流的帧率,并在UI渲染时使用相同的帧率。

  2. 使用SurfaceView或TextureView:在自定义扫码界面中,使用SurfaceViewTextureView来显示相机预览流,确保预览流与UI渲染在同一线程中进行。

  3. 调整UI布局:检查UI布局的绘制顺序,确保扫码界面的UI元素在相机预览流之后绘制,避免UI元素遮挡或影响预览流的显示。

  4. 使用CameraXCamera2 API:如果使用CameraXCamera2 API,确保在PreviewSurfaceProvider中正确处理预览流的显示,避免UI渲染与预览流不同步。

  5. 调试工具:使用HarmonyOS提供的调试工具,如HiLogDevEco Studio的调试功能,检查UI渲染与预览流的同步情况,定位问题所在。

通过以上方法,可以有效解决自定义扫码界面创建时截图与预览流不一致的问题。

回到顶部