Android OpenGL ES+TEBeautyKit预览正常但glReadPixels()存全黑图片求助
Android OpenGL ES + TEBeautyKit 捕获预览帧全黑问题
我正在开发Android项目,使用OpenGL ES结合腾讯TEBeautyKit实现带美颜滤镜的相机预览。预览显示正常,所有滤镜都能正确应用在相机画面上,但调用glReadPixels()捕获照片并保存到相册时,生成的图片完全是黑色的。
操作流程
- 使用自定义
GLCameraXView渲染预览 - 在
queueEvent中调用glReadPixels()捕获帧缓冲,调用glFinish()确保渲染完成 - 通过
MediaScannerConnection将生成的Bitmap保存到相册
捕获代码
public void captureBitmapAsync(OnBitmapCapturedListener listener) { queueEvent(() -> { GLES20.glFinish(); // Ensure all rendering is done int width = getWidth(); int height = getHeight(); int size = width * height; ByteBuffer buffer = ByteBuffer.allocateDirect(size * 4); buffer.order(ByteOrder.nativeOrder()); GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer); int[] data = new int[size]; buffer.asIntBuffer().get(data); Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(data, size - width, -width, 0, 0, width, height); Matrix matrix = new Matrix(); matrix.preScale(1.0f, -1.0f); // Flip vertically Bitmap correctedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false); bitmap.recycle(); post(() -> listener.onBitmapCaptured(correctedBitmap)); }); }
已尝试的解决措施
- 确保
glFinish()在glReadPixels()之前调用 - 验证预览渲染正常
- 确认GLSurfaceView/TextureView处于可见状态
- 验证Bitmap创建与保存无错误
- 尝试在启动预览后延迟捕获操作
存在的问题
- 保存的图片完全为黑色,但预览显示正常
- 日志无报错信息,保存的文件尺寸与格式均正确
求助需求
如何正确捕获OpenGL预览帧并保存为与相机预览一致的图片(而非全黑)?
补充信息
- 使用腾讯TEBeautyKit实现相机预览与美颜滤镜
- 目标设备:[设备型号和Android版本]
- 内部采用自定义EGL配置
内容的提问来源于stack exchange,提问作者gcuhh gcgg
相关产品推荐
相关产品推荐

