如何对包含相机预览、地图、TextView的布局截图(解决相机区域白屏问题)
问题原因
相机预览默认通过SurfaceView/TextureView实现,走硬件加速渲染通道,普通的View绘图缓存截图方式只能捕获软件绘制的View内容,无法拿到硬件渲染的预览帧,因此相机区域显示为全白。
解决方案
- 优先使用TextureView承载相机预览
TextureView支持直接获取当前渲染的预览帧,截图时将预览帧和布局其他元素的截图合并即可,首先在你的camera_previewFrameLayout中添加TextureView作为预览承载控件,替换原来的SurfaceView方案,之后执行截图逻辑:// 1. 获取rl_photo布局内地图、文字等元素的截图 val layoutBitmap = Bitmap.createBitmap(rl_photo.width, rl_photo.height, Bitmap.Config.ARGB_8888) val layoutCanvas = Canvas(layoutBitmap) rl_photo.draw(layoutCanvas) // 2. 获取TextureView渲染的相机预览帧 val previewBitmap = textureView.bitmap // 3. 合并两个Bitmap得到最终截图 val resultBitmap = Bitmap.createBitmap(rl_photo.width, rl_photo.height, Bitmap.Config.ARGB_8888) val mergeCanvas = Canvas(resultBitmap) // 先画底层的相机预览 mergeCanvas.drawBitmap(previewBitmap, 0f, 0f, null) // 再画上层的地图、文字布局 mergeCanvas.drawBitmap(layoutBitmap, 0f, 0f, null) // 后续直接保存resultBitmap即可 - 若必须使用SurfaceView承载预览
可以通过ImageReader/PixelReader获取当前Surface渲染的预览帧,之后执行和上述逻辑一致的合并操作即可。 - 注意事项
截图操作需要在相机预览帧渲染完成、布局绘制完成之后执行,避免出现内容不全的问题。
内容的提问来源于stack exchange,提问作者pawan kumar
相关产品推荐
相关产品推荐

