我正在尝试通过 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/