Java 使用glReadPixels()查找用于截图的正确上下文
我正试图通过glReadPixels()直接从帧缓冲区读取,这样我就可以从屏幕上的任何内容获取屏幕截图。Java 使用glReadPixels()查找用于截图的正确上下文,java,android,opengl-es,screenshot,glreadpixels,Java,Android,Opengl Es,Screenshot,Glreadpixels,我正试图通过glReadPixels()直接从帧缓冲区读取,这样我就可以从屏幕上的任何内容获取屏幕截图。 我没有使用GUI,相反,每当我触摸屏幕时,它应该打印屏幕的原始内容(这对于开始就足够了) 我现在陷入了为gl.glReadPixels()函数获取正确上下文的困境 因为我认为我现在看到的背景与屏幕上的实际内容无关 当我运行应用程序时,它会打印一个libEGL错误 在没有当前上下文的情况下调用OpenGL ES API(每年记录一次) (螺纹) 然后我的数组中填充了零 为了隐藏我的应用程序,我
我没有使用GUI,相反,每当我触摸屏幕时,它应该打印屏幕的原始内容(这对于开始就足够了) 我现在陷入了为gl.glReadPixels()函数获取正确上下文的困境
因为我认为我现在看到的背景与屏幕上的实际内容无关 当我运行应用程序时,它会打印一个libEGL错误 在没有当前上下文的情况下调用OpenGL ES API(每年记录一次) (螺纹) 然后我的数组中填充了零 为了隐藏我的应用程序,我在清单中使用以下行
android:theme="@android:style/Theme.Translucent.NoTitleBar"
代码如下:
公共类截屏活动扩展活动{
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
公共布尔onTouchEvent(运动事件){
如果(event.getAction()==MotionEvent.ACTION\u UP){
保存像素();
}
返回true;
}
EGL10 egl=(EGL10)EGLContext.getEGL();
GL10 gl=(GL10)egl.eglGetCurrentContext().getGL();
公共void savePixels(){
w=getWidth(本);
h=getHeight(此);
int b[]=新int[w*h];
int bt[]=新的int[w*h];
IntBuffer ib=IntBuffer.wrap(b);
ib.位置(0);
gl.glReadPixels(0,0,w,h,GL10.gl_RGBA,GL10.gl_无符号字节,ib);
对于(int i=0;i>16)和0xff;
int pr=(pix
您必须将mGLSurfaceView更改为您的SurfaceView实例。人们是否可以停止滥用OpenGL拍摄屏幕截图?若您想捕获执行glReadPixels调用的程序的渲染输出,这是可以的,但一旦其他程序成为预期的像素源,它就会变得非常不可用负责任的
拍摄全屏截图的唯一可靠方法是直接从GPU视频缓冲存储器中读取。Android基于Linux,Linux为此提供了fbdev设备。由于使用所有这些IOCTL有点麻烦,因此应使用测试库。Android库提供了拍摄屏幕的专用APIhots:终于找到了一个开源程序,它没有使用/dev/graphics/fb0捕获帧缓冲区
该软件包包括一个C程序和一个python脚本,两者都工作得很好。但是当我不打算创建一个软件包时,我的SurfaceView是什么?我的应用程序是隐藏的,应该捕获屏幕的内容(它不属于我的应用程序)。一开始它看起来很有希望,但有一个问题。至少当我运行asl-demo.apk时,它只读取/dev/graphics/fb0中的内容,而我的设备上只有黑色。我已经读到它与tegra 3芯片有关,该芯片不使用fb0帧缓冲区。为了确保我在fb0中填充了/dev/uradom,并且之后有这个随机噪声图像rwards作为屏幕截图。所以它看起来不像是直接从GPU视频缓冲区读取的,是吗?你知道screencap.cpp是如何工作的吗?因为这个函数可以截图。我只需要知道它从哪里获取屏幕截图的数据。@user2207148:它正在与显示合成器对话以检索合成图像。除了直接从帧缓冲存储器读取外,这是在合成图形系统中获取屏幕截图的唯一可靠方法。
mGLSurfaceView.queueEvent(new Runnable() {
public void run() {
savePixels();
}
});