You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:54:52