android - android OpenGL ES 应用程序的屏幕截图

原文 标签 android opengl-es-2.0 screenshot

我在已添加的 GLSurfaceView 上运行了一个基本的 openGL ES 20 应用程序:

    GLSurfaceView view = new GLSurfaceView(this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);

基本上我正在尝试使用以下方法获取屏幕截图:
private static Bitmap getScreenshot(View v)
    {
        Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(b);
        v.draw(c);
        return b;
    }

但似乎位图是透明的。我传递的观点是:
View content = m_rootActivity.getWindow().getDecorView().getRootView();

任何人都有关于如何在 openGL ES 上获取屏幕截图的解决方案,而无需使用我在其他解决方案中看到的 DrawFrame 方法。

也许传入渲染器的引用?任何帮助,将不胜感激。

更新:
我正在探索从 onDrawFrame (Display black screen while capture screenshot of GLSurfaceView) 渲染位图

但是,我想知道是否有更好的解决方案,因为我无法访问渲染器或表面 View 。我可以传递他们的引用,但想要一个解决方案,我们可以像前面提到的那样捕获整个 View 。

最佳答案

See this question .

您可以通过以下方式获取屏幕截图:

@Override
public void onDrawFrame(GL10 gl) {

    GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    // draw ...

    if (takeScreenshot) {

        int screenshotSize = width * height;
        ByteBuffer bb = ByteBuffer.allocateDirect(screenshotSize * 4);
        bb.order(ByteOrder.nativeOrder());
        GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.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);
        // save bitmap...
    }
}

关于android - android OpenGL ES 应用程序的屏幕截图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26808518/

相关文章:

android - 将不同类型的 View 传递给方法

java - 位于任何其他应用程序之上的 Android 弹出式 Activity

c++ - QML OpenGL游戏重绘循环

java - Tomcat /JSP : opening a file on the server and taking a screenshot

java - Android-无法解析方法'onActivityResult(int,int,android.content.Intent)

java - Opengl es 2.0 在视频上绘制位图叠加

iphone - OpenGL ES 不再显示对象

c# - 全局热键在全屏游戏中不起作用

.net - 有没有什么免费的方法可以用 .net 将 html 页面转换为图像

android - 抽屉导航 fragment 不断返回 null