java - 使用 glReadPixels() 找到正确的上下文来截取屏幕截图

标签 java android opengl-es screenshot glreadpixels

我正在尝试通过 glReadPixels() 直接从帧缓冲区读取,以便我可以从屏幕上的任何内容截取屏幕截图。
我没有使用 GUI,相反,每当我触摸屏幕时,它都应该打印屏幕的原始内容(这对于开始来说就足够了)。

我现在陷入了为 gl.glReadPixels() 函数获取正确上下文的困境。
因为我认为我现在获得的上下文与屏幕上实际显示的内容无关。

当我运行应用程序时,它会打印一个 libEGL 错误,其中显示

call to OpenGL ES API with no current context (logged once per thread)

然后我的数组就填满了零。

为了隐藏我的应用程序,我在 list 中使用了以下行。

android:theme="@android:style/Theme.Translucent.NoTitleBar" 

这是代码:

public class ScreenshotActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {   
                savePixels();
        }
        return true;
    }


    EGL10 egl = (EGL10) EGLContext.getEGL();
    GL10 gl = (GL10) egl.eglGetCurrentContext().getGL();

    public void savePixels() {
         w= getWidth(this);
         h= getHeight(this);
         int b[] = new int[w * h];
         int bt[] = new int[w * h];
         IntBuffer ib = IntBuffer.wrap(b);
         ib.position(0);

         gl.glReadPixels(0, 0, w, h, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, ib);


         for (int i = 0; i < h; i++) {
             for (int j = 0; j < w; j++) {
                 int pix = b[i * w + j];
                 int pb = (pix >> 16) & 0xff;
                 int pr = (pix << 16) & 0x00ff0000;
                 int pix1 = (pix & 0xff00ff00) | pr | pb;
                 bt[(h - i - 1) * w + j] = pix1;
                 }
             }

             Log.w("debug", Arrays.toString(bt));
             moveTaskToBack(true);
    }
}

非常感谢您的帮助:)

最佳答案

人们可以停止尝试滥用 OpenGL 来截取屏幕截图吗?如果您想捕获执行 glReadPixels 调用的程序的渲染输出,这很好,但一旦其他程序成为预期的像素源,它就会变得非常不可靠。

获取全屏屏幕截图的唯一可靠方法是直接从 GPU 视频缓冲区内存中读取。 Android 基于 Linux,Linux 为此提供了 fbdev 设备。由于使用所有这些 ioctl 有点麻烦,应该使用一些经过测试的库。有一个 Android 库提供了用于截取屏幕截图的专用 API: http://code.google.com/p/android-screenshot-library/wiki/DeveloperGuide

关于java - 使用 glReadPixels() 找到正确的上下文来截取屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15655148/

相关文章:

iphone - 在 iPad 上流畅书写

java - 将 XML 键值映射转换为 JSON 对象

java - 两个日期之间的期间数(自定义)

java - “找不到或加载主类”是什么意思?

android - 如何从首选项屏幕打开 AlertDialog?

java - 当未输入任何内容并按下按钮时 Android 应用程序崩溃

opengl - 对于制服和顶点属性,OpenGL 索引和位置是否相同?

java - 如果 HashSet 中已存在项目,则提醒用户

java - 如何从 Fragment 中的 JSON 响应中的对象获取数据

安卓 ICS : JNI error attempt to use stale local reference 0x1