【问题标题】:Android OpenGL ScreenshotAndroid OpenGL 截图
【发布时间】:2011-06-11 12:31:52
【问题描述】:

我搜索了很多关于在 Android 上截取我的 OpenGL 对象的截图,并提出了this 解决方案。它工作得很好,但在我的情况下,我在相机视图顶部有相机视图和 opengl 视图(具有透明背景)。所以我想要做的是获得透明背景而不是黑色的opengl截图。 正如我所说,我已经尝试了上面的链接并且它有效,但我被黑色背景困住了。在这种特殊情况下,弄清楚如何摆脱黑色背景有点复杂。 希望有人可以帮助我,如果可能的话尽快(我认为解决方案很简单,我只是缺少一些简单的东西)。 谢谢。

【问题讨论】:

    标签: android opengl-es screenshot pixels


    【解决方案1】:

    我使用了以下方法并且像冠军一样工作。

    public static Bitmap SavePixels(int x, int y, int w, int h, GL10 gl)
    {  
         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++)
         {//remember, that OpenGL bitmap is incompatible with Android bitmap
          //and so, some correction need.        
              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);
         return sb;
    }
    

    你只需要打电话

    YourClass.SavePixels(0,0,width,height,gl);
    

    我希望这对你有用...

    谢谢, 弥敦道

    【讨论】:

    • 看起来很有希望!抱歉,太忙了……很快就会测试它。
    • @Midhere... 黑屏截图。
    • @Midhere 你如何初始化 gl ?
    • 您应该使用 GLSurfaceView 并通过实现渲染回调来初始化 gl。 GLSurfaceview 将渲染/绘制您的 3d 图形,您需要在 onDrawFrame(GL10 gl) 方法下编写图形绘制代码。所以 savepixels 应该在绘制完所有图形组件后调用。否则,您将看到黑屏。
    • 如何获得 gl ?
    【解决方案2】:

    您提到的解决方案是使用不支持 Alpha 通道的Bitmap.Config.RGB_565

    Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
    

    您应该使用Bitmap.Config.ARGB_8888Bitmap.Config.ARGB_4444

    【讨论】:

    • 谢谢。我曾尝试使用 ARGB_4444,但我得到的图像颜色混乱(我认为有些东西已经发生了变化,它看起来很有趣,有许多不同的颜色)。我想我需要更改将像素转换为 rgb 的算法。当我尝试 8888 时,我收到关于位图大小的错误。我应该如何更改尺寸?
    • ARGB_4444 '弄乱'你的颜色,因为它使用一半的空间来保存相同的信息。而 RGB_8888 为每个通道(R、G、B 和 alpha 通道)使用 8 位,而 RGB_4444 为每个通道使用 4 位,因此会截断信息并给出非常糟糕的感知质量。最突出的效果是条带和颜色失真。一些抖动技术试图解决它,但我不知道它们是否在 Android 中原生可用。如果 8888 出现内存错误,请尝试减小位图的大小。也许您的设备没有足够的可用 RAM。
    • 即使使用 Bitmap.Config.ARGB_8888 ,也会产生黑色背景。
    • 函数应该在 Open GL 线程上运行:stackoverflow.com/questions/5234867/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多