3

我正在尝试通过转换将位图转换为 libGDX 纹理:

  1. 安卓Bitmapbyte[]
  2. byte[]到 libGDXPixmap
  3. libGDXPixmap到 libGDXTexture

我面临的问题是转换为纹理的位图正在从资产文件夹中的纹理打包器中绘制精灵表

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

4 回答 4

19

如果目标是将 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
        }
      });
于 2014-01-23T21:06:20.603 回答
12

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

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();
    }
}
于 2013-05-02T00:47:10.550 回答
1

您必须在新线程上编写代码,因为 pixmap 类需要时间进行字节转换,并且有时会返回一个临时 pixmap,以防进程尚未完成,因此最好在单独的线程上运行,您的问题将得到解决。

于 2013-06-20T07:11:03.090 回答
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 将数据输入(预绑定)纹理。

您上面的管道包括像素数据的多个副本和重新压缩;此管道允许您将位图数据直接输入到纹理中,只需一个副本(无论如何都是字节格式转换所必需的)。这对你有用吗?

于 2013-07-26T14:49:08.110 回答