gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:43:58 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com