截取Android OpenGL截图

我正在尝试Android的OpenGL截图。

我find的代码如下:

nt size = width * height; ByteBuffer buf = ByteBuffer.allocateDirect(size * 4); buf.order(ByteOrder.nativeOrder()); glContext.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, buf); int data[] = new int[size]; buf.asIntBuffer().get(data); buf = null; Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); bitmap.setPixels(data, size-width, -width, 0, 0, width, height); data = null; short sdata[] = new short[size]; ShortBuffer sbuf = ShortBuffer.wrap(sdata); bitmap.copyPixelsToBuffer(sbuf); for (int i = 0; i < size; ++i) { //BGR-565 to RGB-565 short v = sdata[i]; sdata[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11)); } sbuf.rewind(); bitmap.copyPixelsFromBuffer(sbuf); try { FileOutputStream fos = new FileOutputStream("/sdcard/screeshot.png"); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (Exception e) { // handle } 

我也尝试从该网站的链接文本代码

在每种情况下,结果是一个完全黑色的PNG文件。 我发现glReadPixels方法有一些问题,但我不知道如何绕过它。

Solutions Collecting From Web of "截取Android OpenGL截图"

回复晚了非常抱歉…

为了执行正确的屏幕截图,您必须将以下代码放入您的onDrawFrame(GL10 gl)处理程序中:

 if(screenshot){ int screenshotSize = width * height; ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); bb.order(ByteOrder.nativeOrder()); gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); int pixelsBuffer[] = new int[screenshotSize]; bb.asIntBuffer().get(pixelsBuffer); bb = null; Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); bitmap.setPixels(pixelsBuffer, screenshotSize-width, -width, 0, 0, width, height); pixelsBuffer = null; short sBuffer[] = new short[screenshotSize]; ShortBuffer sb = ShortBuffer.wrap(sBuffer); bitmap.copyPixelsToBuffer(sb); //Making created bitmap (from OpenGL points) compatible with Android bitmap for (int i = 0; i < screenshotSize; ++i) { short v = sBuffer[i]; sBuffer[i] = (short) (((v&0x1f) << 11) | (v&0x7e0) | ((v&0xf800) >> 11)); } sb.rewind(); bitmap.copyPixelsFromBuffer(sb); lastScreenshot = bitmap; screenshot = false; } 

每当用户按下button创build屏幕截图或在任何其他您需要的情况下,“屏幕截图”类字段都将设置为true。 在“if”主体内部你可以放置任何截图创build代码示例你可以在互联网上find – 最重要的是拥有当前的GL10实例。 例如,当您将GL10实例保存到类variables,然后在事件之外使用它来创build屏幕截图时,您将最终得到完全空白的图像。 这就是为什么你必须在当前的GL10实例的OnDrawFrame事件处理程序中进行截图。 希望它有帮助。

最好的问候,戈登。

如果你想保持质量(每个颜色通道8位,也是红色,绿色,蓝色和阿尔法),可以这样做:

 if (this.screenshot) { int screenshotSize = this.width * this.height; ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4); bb.order(ByteOrder.nativeOrder()); gl.glReadPixels(0, 0, width, height, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, bb); int pixelsBuffer[] = new int[screenshotSize]; bb.asIntBuffer().get(pixelsBuffer); bb = null; for (int i = 0; i < screenshotSize; ++i) { // The alpha and green channels' positions are preserved while the red and blue are swapped pixelsBuffer[i] = ((pixelsBuffer[i] & 0xff00ff00)) | ((pixelsBuffer[i] & 0x000000ff) << 16) | ((pixelsBuffer[i] & 0x00ff0000) >> 16); } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); bitmap.setPixels(pixelsBuffer, screenshotSize-width, -width, 0, 0, width, height); this.screenshot = false; } 

得到它了!

我的错误是我在类variables中记住GL上下文。 为了获得屏幕截图,我必须在实现GLSurfaceView.Renderer接口的类中使用传递给OnDraw的gl上下文。 我只是在“if”子句中使用我的代码,一切都按预期工作。 希望这句话能帮助任何人。

最好的问候,戈登