HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题
HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题
【问题现象】
自定义相机,使用createPixelMapFromSurface
创建XComponent的截图和自定义扫码预览流XComponent中显示的不一致,createPixelMapFromSurface
创建的截图不完整。
【背景知识】
- 开发者可通过XComponent显示自定义相机扫码界面。
- image.createPixelMapFromSurface这个方法可以通过传入XComponent的surfaceId,以及region选定区域的信息来获取XComponent显示的截图。
- 相机预览流支持的像素获取cameraOutputCapability.previewProfiles。
【定位思路】
(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 } }
【解决方案】
通过相机预览回调的宽高设置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}`);
});
使用相机预览流设置宽高后返回的截图:
更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中如何解决自定义扫码界面创建的截图与预览流中不一致问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,自定义扫码界面创建时出现截图与预览流不一致的问题
在HarmonyOS鸿蒙Next中,自定义扫码界面创建时出现截图与预览流不一致的问题,通常是由于UI渲染与预览流的帧率不同步导致的。可以通过以下步骤解决:
-
同步帧率:确保UI渲染的帧率与相机预览流的帧率一致。可以通过
CameraConfig.Builder
设置预览流的帧率,并在UI渲染时使用相同的帧率。 -
使用SurfaceView或TextureView:在自定义扫码界面中,使用
SurfaceView
或TextureView
来显示相机预览流,确保预览流与UI渲染在同一线程中进行。 -
调整UI布局:检查UI布局的绘制顺序,确保扫码界面的UI元素在相机预览流之后绘制,避免UI元素遮挡或影响预览流的显示。
-
使用
CameraX
或Camera2
API:如果使用CameraX
或Camera2
API,确保在Preview
的SurfaceProvider
中正确处理预览流的显示,避免UI渲染与预览流不同步。 -
调试工具:使用HarmonyOS提供的调试工具,如
HiLog
或DevEco Studio
的调试功能,检查UI渲染与预览流的同步情况,定位问题所在。
通过以上方法,可以有效解决自定义扫码界面创建时截图与预览流不一致的问题。