gpt4 book ai didi

Android 源代码不工作,通过 glReadPixels 读取帧缓冲区

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:08:52 25 4
gpt4 key购买 nike

我是 Android 开发的新手,有一项任务是在指定的时间间隔后读取帧缓冲区数据。

我想出了以下代码:

public class mainActivity extends Activity {
Bitmap mSavedBM;
private EGL10 egl;
private EGLDisplay display;
private EGLConfig config;
private EGLSurface surface;
private EGLContext eglContext;
private GL11 gl;
protected int width, height;


//Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

// get the screen width and height
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenWidth = dm.widthPixels;
int screenHeight = dm.heightPixels;

String SCREENSHOT_DIR = "/screenshots";
initGLFr(); //GlView initialized.
savePixels( 0, 10, screenWidth, screenHeight, gl); //this gets the screen to the mSavedBM.
saveBitmap(mSavedBM, SCREENSHOT_DIR, "capturedImage");

//Now we need to save the bitmap (the screen capture) to some location.
setContentView(R.layout.main); //This displays the content on the screen

}
private void initGLFr()
{
egl = (EGL10) EGLContext.getEGL();
display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
int[] ver = new int[2];
egl.eglInitialize(display, ver);

int[] configSpec = {EGL10.EGL_NONE};
EGLConfig[] configOut = new EGLConfig[1];
int[] nConfig = new int[1];
egl.eglChooseConfig(display, configSpec, configOut, 1, nConfig);
config = configOut[0];
eglContext = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, null);
surface = egl.eglCreateWindowSurface(display, config, SurfaceHolder.SURFACE_TYPE_GPU, null);
egl.eglMakeCurrent(display, surface, surface, eglContext);
gl = (GL11) eglContext.getGL();
}
public void savePixels(int x, int y, int w, int h, GL10 gl)
{
if (gl == null)
return;

synchronized (this) {
if (mSavedBM != null) {
mSavedBM.recycle();
mSavedBM = null;
}
}

int b[] = new int[w * (y + h)];
int bt[] = new int[w * h];
IntBuffer ib = IntBuffer.wrap(b);
ib.position(0);
gl.glReadPixels(x, 0, w, y + h, GL10.GL_RGBA,GL10.GL_UNSIGNED_BYTE,ib);

for (int i = 0, k = 0; i < h; i++, k++)
{
//OpenGLbitmap is incompatible with Android bitmap
//and so, some corrections need to be done.
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 - k - 1) * w + j] = pix1;
}
}

Bitmap sb = Bitmap.createBitmap(bt, w, h, Bitmap.Config.ARGB_8888);
synchronized (this)
{
mSavedBM = sb;
}
}

static String saveBitmap(Bitmap bitmap, String dir, String baseName) {
try {
File sdcard = Environment.getExternalStorageDirectory();
File pictureDir = new File(sdcard, dir);
pictureDir.mkdirs();
File f = null;
for (int i = 1; i < 200; ++i) {
String name = baseName + i + ".png";
f = new File(pictureDir, name);
if (!f.exists()) {
break;
}
}
if (!f.exists()) {
String name = f.getAbsolutePath();
FileOutputStream fos = new FileOutputStream(name);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.flush();
fos.close();
return name;
}
} catch (Exception e) {

} finally {

//if (fos != null) {
// fos.close();
// }

}
return null;
}

此外,如果有人可以指导我以更好的方式读取帧缓冲区,那就太好了。我正在使用 Android 2.2 和 API 级别 8 的虚拟设备。我经历了很多以前的讨论,发现我们不能直接通过“/dev/graphics/fb0”读取帧缓冲区。

(编辑:重新格式化第一行代码)

最佳答案

问题解决了,关于上面代码的执行。但我仍然无法读取帧缓冲区数据。

我深入研究了内部结构,并追溯了之前关于在 Android 1.5 之前的旧版本上访问帧缓冲区的所有声明。

Android pre 1.5 上的移植确实有关于直接通过/dev/fb0 访问framebuffer 的帖子。这不适用于更高版本,Android 开发团队没有他们在 android google 组中提到的计划。

我希望这可以帮助很多人花费大量时间来找出方法。

问候,阿里

关于Android 源代码不工作,通过 glReadPixels 读取帧缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2996759/

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