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

发布于 1周前 作者 eggper 最后一次编辑是 5天前 来自 鸿蒙OS

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

【问题现象】

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

【背景知识】

【定位思路】

(1)查看自定义扫码中预览流的宽高比,像素比是width*height为2336*1080。

(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 } }

【解决方案】

通过相机预览回调的宽高设置createPixelMapFromSurface的image.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}`);
 });
 

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

1 回复

针对HarmonyOS 鸿蒙Next中自定义扫码界面创建的截图与预览流不一致的问题,可以尝试以下解决方案:

  1. 确保代码逻辑正确:检查自定义扫码界面的代码逻辑,确保在截图和预览流中使用的相机参数、配置等保持一致。特别是要注意分辨率、缩放比例等设置,确保它们在不同场景下能够正确应用。
  2. 优化相机管理:在自定义扫码界面中,合理管理相机的开启、关闭和预览流的处理。确保在截图时相机状态稳定,预览流没有中断或异常。
  3. 考虑设备兼容性:不同设备可能存在硬件差异或系统优化问题,导致截图与预览流不一致。建议在不同设备上进行测试,并根据测试结果进行针对性的优化。
  4. 检查API调用:确保使用的API与HarmonyOS 鸿蒙Next版本兼容,并正确调用相关API来处理截图和预览流。

如果以上方案均无法解决问题,建议联系官网客服以获取更专业的帮助。官网地址是:https://www.itying.com/category-93-b0.html

回到顶部