【问题标题】:How to draw a bitmap on Android using OpenGL如何使用 OpenGL 在 Android 上绘制位图
【发布时间】:2010-08-30 01:55:27
【问题描述】:

我有一个 RGB 值的字节数组,就像 *.bmp 文件的内容(没有标题)一样。我想做的是,在Android上绘制相应的位图,使用OpenGL。

似乎 OpenGL ES 没有一个 API 可以做到这一点,是吗?

如果是真的,我该怎么做?

PS:实际上,我可以用 JAVA 代码绘制它,但是它太慢了,而且占用了太多 CPU 时间。所以我想尝试用OpenGL绘制它。还有其他建议吗?或者也许 OpenGL 不是正确的答案?

谢谢大家!

【问题讨论】:

    标签: android opengl-es bitmap


    【解决方案1】:

    bmp 是一种非常糟糕的格式,您应该使用 png 文件。它们更小,提供相同的质量。使用 openGL 也很容易使用它们。

    您可以在 Android 中轻松完成。 您需要研究纹理加载。这是一个链接:http://qdevarena.blogspot.com/2009/02/how-to-load-texture-in-android-opengl.html

    【讨论】:

      【解决方案2】:

      这是一个非常笼统的问题,您可以在互联网上找到很多 Android OpenGL ES 代码示例。

      然而,一个好的开始是 Google IO 关于为 Android 编写实时游戏的会谈:

      http://code.google.com/events/io/2009/sessions/WritingRealTimeGamesAndroid.html

      http://www.androidphonethemes.com/google-io-2010-writing-real-time-games-for-android-redux

      请参阅我刚刚链接的第一个演示文稿的第 23 至 25 页,以比较 Android 中现有的不同 Canvas 和 OpenGL ES 绘图方法。

      【讨论】:

        【解决方案3】:

        我不确定您得到的答案是否与您提出的问题有关。我相信我也有同样的问题,但是我对在屏幕上绘制位图不感兴趣,我对创建(在 ) 快速位图,使用 GL 而不是 java 计算。 由于我在网络上的任何地方都找不到对我的问题的答复,所以我刚开始阅读 GL API,我解决问题的方法是在其他地方打开“grabdata”标志后使用 glReadPixels 读取我的 onDrawFrame 方法绘制的像素在程序中,是这样的:

        // imports
        import java.nio.ByteBuffer;
        import java.nio.ByteOrder;
        import javax.microedition.khronos.opengles.GL10;
        import android.graphics.Bitmap;
        import android.opengl.GLES20;
        
        
        //somewhere inside the class that implements GLSurfaceView.Renderer:
            
        ByteBuffer data;
        private int height;
        private int width;
        boolean grabdata=false;
            
        public void onSurfaceChanged(GL10 glUnused, int width, int height)  {
        this.width=width;
        this.height=height;
        data=ByteBuffer.allocateDirect(width*height*4).order(ByteOrder.nativeOrder());
        /*
        ......
        prepare the surface
        .......                  
        */
        }
        
        public void onDrawFrame(GL10 glUnused) {
        
        /*
        actually draw whatever you want, set matrices, rotate, draw etc... 
        drawTriangle(mTriangleVertices);
        .
        . 
        .
        */
        if (grabdata) {
         GLES20.glReadPixels(0,0,width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE,data);
         grabdata=false; //until we want to read again
         //create a bitmap now if you havent prepared it somewhere else.
         Bitmap.Config conf = Bitmap.Config.ARGB_8888; 
         Bitmap bitmap = Bitmap.createBitmap(width, height, conf);
         bitmap.copyPixelsFromBuffer(data);
         //do something with it....
         // storeImage(bitmap);
         data.clear();
         }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-05
          • 1970-01-01
          • 2014-04-11
          • 2012-07-13
          • 1970-01-01
          • 2011-05-08
          • 1970-01-01
          • 2014-09-25
          相关资源
          最近更新 更多