IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

OpenGLRenderer : Cannot generate texture from bitmap


Sujet :

Android

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 20
    Points
    20
    Par défaut OpenGLRenderer : Cannot generate texture from bitmap
    Bonjour,

    Je dois réaliser un traitement sur une image donnée.
    Comme ce dernier est assez lourd, je le délègue à une Asynctask .

    Cette image est chargée, affichée dans une ImageView puis passé en paramètre à l'asyncTask qui s'execute ensuite. Tout cela se fait dans dans le OnCreate de l'activité.

    Pour faire patienter l'utilisateur (le calcul peu prendre une dizaine de secondes), l'image est rafraichie à diverse étapes en appelant la méthode postInvalidate de l'imageView . Enfin, j'appel invalidate dans onPostExecute.

    Le problème est que de temps en temps (ça ne le fait pas à chaque fois) la console m'affiche l'erreur suivante : OpenGLRenderer : Cannot generate texture from bitmap.
    Cela à pour effet de ne pas rafraichir l'image et il est ensuite impossible de la rafraichir à nouveau.

    Je n'arrive pas à trouver la source de l'erreur, car le problème se produit assez aléatoirement, la plupart du temps ca marche, parfois seule une bande de l'image est "perdue" et plus rarement, l'imageView reste entièrement noire.

    Cette erreur se produit sur l'émulateur et sur une tablette nexus10, qui tournent tous deux sous jelly beans

    Voici le code simplifié de l'asynTask
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    public class MappingTask extends AsyncTask<Void, Void, Void> {
     
    	private Bitmap picture;
    	private ImageView view;
     
    	public MappingTask(Bitmap image, ImageView view) {
    		this.view = view;
    		picture = image;
    	}
     
    	@Override
    	protected Void doInBackground(Void... unused) {
     
    		for (int x = 0; x < picture.getWidth(); x++) {
    			for (int y = 0; y < picture.getHeight(); y++) {
    				pixelColor = picture.getPixel(x, y);
     
    				//Calculs à partir de la couleur du pixel
     
    				picture.setPixel(x, y, newColor);
    			}			
    			if(x%(50)==0) 
    				view.postInvalidate();
    		}
    		return null;
    	}
     
    	@Override
        protected void onPostExecute(Void unused) {
    		view.invalidate();
        }
    }
    J'ai essayé de rafraichir l'image avec la méthode invalidate utilisée dans onProgressUpdate() mais cela ne change rien. Le fait de ne pas rafraichir l'image durant sa modification fonctionne jusqu'à ce que je le fasse dans le onPostExecute qui produit la même erreur.

    Avez vous une idée de la source du problème?

    Merci d'avance pour vos réponses

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 20
    Points
    20
    Par défaut
    Aucune idée?
    J'ai pas expliqué le problème assez clairement ou bien c'est parce que j'utilise carrément pas la bonne méthode?
    Parce que même une remarque de ce genre m'aiderai.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 19
    Points : 20
    Points
    20
    Par défaut
    Solution trouvée par hasard sur le web : l'utilisation de setPixel() et getPixel() utilisait trop de mémoire et le garbage collector libérait de la mémoire utilisée par la bitmap, c'est pourquoi les "zones mortes" étaient autant aléatoire.

    Il fallait utiliser un IntBuffer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    IntBuffer pictureBuffer =  IntBuffer.allocate(pictureWidth*pictureHeight);
    picture.copyPixelsToBuffer(pictureBuffer);
    // Modifications des pixels sur pictureBuffer 
    //(! c'est un tableau à une dimension !)
    picture.copyPixelsFromBuffer(pictureBuffer);
    En espérant que cela aide quelqun d'autre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL2005 Client --> Cannot generate SSPI context
    Par snach dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/02/2008, 23h03
  2. Pb de texture Opengl <-> Bitmap
    Par _chafouin_ dans le forum OpenGL
    Réponses: 10
    Dernier message: 12/02/2007, 15h14
  3. [FOP] [ERROR] non-static variable this cannot be referenced from a static context
    Par cash3000 dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/05/2006, 16h46
  4. Erreur : cannot be referenced from a static context
    Par Belegkarnil dans le forum Langage
    Réponses: 2
    Dernier message: 21/12/2005, 07h24
  5. Réponses: 3
    Dernier message: 05/12/2005, 10h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo