3 votes

Conversion des bitmaps Android en textures LibGdx

J'essaie de convertir un bitmap en une texture libGDX par conversion :

  1. Android Bitmap a byte[]
  2. byte[] à libGDX Pixmap
  3. libGDX Pixmap à libGDX Texture

Le problème que je rencontre est que le bitmap qui est converti en texture dessine la feuille de sprite à partir du packer de texture qui se trouve dans le dossier assets.

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();
    }
}

19voto

Andy Shiue Points 131

Si le but est de convertir un Bitmap Android en une Texture libgdx, vous n'avez pas besoin d'utiliser Pixmap du tout. Vous pouvez le faire directement avec l'aide de simples OpenGL et Android GLUtils. Essayez ce qui suit ; c'est 100x plus rapide que votre solution. Je suppose que vous n'êtes pas dans le thread de rendu (vous ne devriez probablement pas). Si vous l'êtes, vous n'avez pas besoin d'appeler 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
        }
      });

12voto

P_Dog Points 163

Hmm une autre possibilité est que vous ayez un problème d'enfilage. J'ai remarqué ce genre de problème lorsque je charge mes propres textures non gérées sur le thread de l'interface utilisateur pendant que libgdx fait son travail en chargeant les textures simultanément sur le thread de rendu. Si c'est le problème, la solution simple est de synchroniser la création de la texture avec le thread de rendu en utilisant Gdx.app.postRunnable. i.e. :

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();
    }
}

1voto

Paras Mittal Points 984

Vous devez coder sur un nouveau thread parce que la classe pixmap prend du temps pour la conversion des octets et renvoie parfois une pixmap temporaire au cas où le processus n'est pas terminé, il est donc préférable d'exécuter sur un thread séparé et votre problème sera résolu.

1voto

Mark McKenna Points 915

Êtes-vous engagé dans ce pipeline opérationnel ? Voici une autre façon d'effectuer la conversion que vous avez demandée :

  1. Implémentez com.badlogic.gdx.graphics.TextureData pour prendre un Android.graphics.Bitmap dans le constructeur.
  2. Dans prepare(), allouez et remplissez un IntBuffer en utilisant Bitmap.getPixels.
  3. Utilisez Bitmath pour échanger les données dans le tampon de ARGB à RGBA : (arr[i] << 8) | (arr[i]>>24)
  4. Dans getType() return TextureData.TextureDataType.Compressed
  5. Dans consumeCompressedData(), appelez glTexImage2D pour introduire les données dans la texture (pré-configurée).

Votre pipeline ci-dessus comprend plusieurs copies et recompressions des données de pixels ; ce pipeline vous permet d'introduire vos données Bitmap directement dans la texture avec une seule copie (nécessaire pour la conversion du format d'octet de toute façon). Cela vous conviendrait-il ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X