将Android位图转换为LibGdx的纹理

时间:2013-02-18 06:11:18

标签: android libgdx

我试图通过转换:

将位图转换为libGDX纹理
  1. Android Bitmapbyte[]
  2. byte[]到libGDX Pixmap
  3. libGDX Pixmap到libGDX Texture
  4. 我面临的问题是转换为纹理的位图是从资源文件夹中的纹理打包器中绘制精灵表

    public void onByteArrayOfCroppedImageReciever(byte[] bytes) {
        try {
            pmap=new Pixmap(bytes, 0, bytes.length);
            tex=new Texture(pmap);
            face=new Sprite(tex);
            // game.setScreen(new GameScreen(game, batcher, face));
        } catch(Exception e) {
            Gdx.app.log("KS", e.toString());
            e.printStackTrace();
        }
    }
    

4 个答案:

答案 0 :(得分:17)

如果目标是将Android位图转换为libgdx纹理,则根本不需要使用Pixmap。您可以在简单的OpenGL和Android GLUtils的帮助下直接完成。尝试以下方法;它比您的解决方案快100倍。我假设你不在渲染线程中(你最不可能)。如果是,您不需要调用postRunnable()。

       Gdx.app.postRunnable(new Runnable() {
        @Override
        public void run() {
          Texture tex = new Texture(bitmap.getWidth(), bitmap.getHeight(), Format.RGBA8888);
          GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, tex.getTextureObjectHandle());
          GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
          GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
          bitmap.recycle();
          // now you have the texture to do whatever you want
        }
      });

答案 1 :(得分:12)

另一种可能性是你遇到了线程问题。我在UI线程上加载我自己的非托管纹理时注意到了这种问题,而libgdx在渲染线程上同时加载纹理。 如果这是问题,那么简单的解决方案是使用Gdx.app.postRunnable将纹理的创建与渲染线程同步。即:

public void onByteArrayOfCroppedImageReciever(byte[] bytes) {
    try {
        pmap=new Pixmap(bytes, 0, bytes.length);
        Gdx.app.postRunnable(new Runnable() {
            @Override
            public void run() {            
                tex=new Texture(pmap);
                face=new Sprite(tex);
            }
        });
    } catch(Exception e) {
        Gdx.app.log("KS", e.toString());
        e.printStackTrace();
    }
}

答案 2 :(得分:1)

你必须在一个新线程上编码,因为pixmap类需要时间进行字节转换,有时会返回一个临时像素图,以防过程没有完成,所以最好在一个单独的线程上运行,你的问题就会得到解决。

答案 3 :(得分:1)

您是否致力于该运营管道?以下是您要求进行转换的另一种方法:

  1. 实现com.badlogic.gdx.graphics.TextureData以在构造函数中获取android.graphics.Bitmap。
  2. 在prepare()中,使用Bitmap.getPixels分配并填充IntBuffer。
  3. 使用bitmath将缓冲区中的数据从ARGB交换到RGBA:(arr[i] << 8) | (arr[i]>>24)
  4. 在getType()中返回TextureData.TextureDataType.Compressed
  5. 在consumeCompressedData()中调用glTexImage2D将数据提供给(预绑定)纹理。
  6. 上面的管道包含多个像素数据的副本和重新压缩;此管道允许您仅使用一个副本(无论如何都需要字节格式转换)将Bitmap数据直接输入到纹理中。这对你有用吗?