2013-02-18 3 views
2

je suis en train de convertir bitmap en libGDX Texture en convertissant:Conversion Android Bitmap à la texture de LibGdx

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

Le problème auquel je fais face est que le bitmap qui est converti d à la texture dessine la feuille de sprite de packer de texture qui est dans le dossier des actifs

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

Il est très étrange de voir le mauvais contenu dans le Pixmap. Êtes-vous sûr de dessiner le Pixmap que vous attendez? Essayez de créer un nouveau Pixmap() avec un contenu connu (par exemple, utilisez "drawCircle") et assurez-vous de voir le pixmap que vous affichez. En outre, le constructeur Pixmap que vous utilisez actuellement attend des octets codés JPG/PNG/BMP. Comment avez-vous obtenu les octets de l'Android Bitmap? –

Répondre

10

hmm Une autre possibilité est que vous avez un problème de filetage. J'ai remarqué ce genre de problème lors du chargement de mes propres textures non gérées sur le thread UI tandis que libgdx fait son truc en chargeant des textures simultanément sur le thread de rendu. Si tel 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. à savoir:

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

Cette question et cette réponse m'ont sauvé la vie! – atok

+0

@P_Dog Je suis confronté à un problème avec le fil. Pouvez-vous aider avec cela? http: // stackoverflow.com/questions/32660894/send-données-de-gdx-app-postrunnable-thread – Itkrux

1

vous devez coder sur un nouveau thread parce que la classe pixmap prend du temps pour la conversion d'octets et parfois renvoie un pixmap temporaire au cas où le hasnt processus terminé ainsi son mieux courir sur un séparé fil et votre problème être résolu.

1

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

  1. Mettre en oeuvre com.badlogic.gdx.graphics.TextureData prendre un android.graphics.Bitmap dans le constructeur.
  2. Dans prepare(), allouez et remplissez un IntBuffer en utilisant Bitmap.getPixels.
  3. Utilisation bitmath pour échanger les données dans le tampon de ARGB à RVBA: (arr[i] << 8) | (arr[i]>>24)
  4. Dans getType() retour TextureData.TextureDataType.Compressed
  5. Dans consumeCompressedData() appeler glTexImage2D pour alimenter les données dans la (prélié) texture .

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

+0

Will l'essayer à coup sûr et vous permettra de savoir si elle résout mon but de le faire de cette façon –

16

Si l'objectif est de convertir un bitmap Android en texture libgdx, vous n'avez pas du tout besoin d'utiliser Pixmap. Vous pouvez le faire directement à l'aide de simples OpenGL et Android GLUtils. Essayez les suivants; il est 100 fois plus rapide que votre solution. Je suppose que vous n'êtes pas dans le fil 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 
     } 
     }); 
+1

merci beaucoup bro va essayer que pour sûr à l'avenir est que j'en ai besoin THanks –

+1

Mec c'est génial, merci. –

+1

thx tellement. Tu es incroyable. –

Questions connexes