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 :

Erreur "Out of memory" sur image provenant de la galerie


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut Erreur "Out of memory" sur image provenant de la galerie
    Bonjour,

    J'ai une image d'environ 1500px x 900px de ma galerie du téléphone et quand je la sélectionne j'ai une erreur de type "VM Budget - Out of Memory". J'ai trouvé une méthode (voir ci-dessous) qui me permet de contourner le problème.

    Cependant lorsque j'utiliise cette méthode, la qualité de mon image est vraiment pas belle sachant que la qualité de l'originale est très bonne.

    Comment faire pour garder à la fois une bonne qualité de l'image, le bon ratio (car je veux aussi redimensionner mon image à 700px'") et contourner le problème de Out of Memory

    Merci de votre aide.

    Ma méthode permettant de contourner le problème Out of Memory

    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
     
    	private Bitmap decodeFile(File f){
    	    try {
    	        //Decode image size
    	        BitmapFactory.Options o = new BitmapFactory.Options();
    	        o.inJustDecodeBounds = true;
    	        BitmapFactory.decodeStream(new FileInputStream(f),null,o);
     
    	        //The new size we want to scale to
    	        final int REQUIRED_SIZE=70;
     
    	        //Find the correct scale value. It should be the power of 2.
    	        int scale=1;
    	        while(o.outWidth/scale/2>=REQUIRED_SIZE && o.outHeight/scale/2>=REQUIRED_SIZE)
    	            scale*=2;
     
    	        //Decode with inSampleSize
    	        BitmapFactory.Options o2 = new BitmapFactory.Options();
    	        o2.inSampleSize=scale;
    	        return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
    	    } catch (FileNotFoundException e) {}
    	    return null;
    	}

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 182
    Par défaut
    Pour redimensionner, tu peux utiliser les Matrix

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Je ne comprend pas très bien.
    Dans le cas d'une GridView, il y a plusieurs images d'où le problème de mémoire si elles sont trop grosses.
    Mais pour afficher un petit carré ça ne sert à rien d'avoir une image en haute définition.
    Et dans un autre affichage, rien ne t’empêche d'afficher l'image en grande taille car si elle est seule, plus de problème de mémoire.
    La technique est donc de créer dynamiquement des vignettes pour la GridView et d'utiliser l'image non-réduite pour une grosse vue.

  4. #4
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    J'ai du mal m'exprimer il n'est pas question de GridView . Quand je parle de gallérie c'est la gallérie d'image du téléphone portable. En fait je sélectionne une image que je vais ensuite envoyé sur un serveur.

    Mon premier problème est : Comment garder la meme qualite de mon image sans avoir une error Out of Memory avec un redimensionnement.

    Auriez vous des exemples a me proposer?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Par défaut
    Alors dans ce cas, je pense que ça vient de ton utilisation du fichier.
    Si tu ne veux que l'envoyer vers un serveur, il existe bien des moyens, un requête post étant le plus simple à mon gout.
    Je pense que c'est sur l'envoi que tu devrais te pencher, ta méthode qui met tout en mémoire n'est pas optimisée.

    Personnellement pour envoyer un fichier j'utilise la lib apache.


    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    queryUpload(final String url, byte[] data) {
    	// req
    	HttpClient httpclient = getClient();
    	HttpPost post = new HttpPost(url);
    	//
    	MultiPartEntity multiEntity = new MultiPartEntity();
    	multiEntity.addPart("upload", new ByteArrayBody(data, "data"));
    	post.setEntity(multiEntity);
    	//
    	HttpResponse repHttp = httpclient.execute(post);
    	return  repHttp.getEntity().getContent();
    }

    A utiliser dans une AsyncTask de préférence.

    Edit: d’ailleurs c'est plutôt une FileEntity qui conviendrait le mieux

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 281
    Par défaut
    Pour l'envoi sur serveur je n'ai aucun problème d'ailleurs j'utilise pratiquement la même méthode que vous.

    Mon problème c'est le traitement de l'image avant envoie sur serveur. Je veux juste savoir comment garder la même qualité de ma Bitmap tout en redimensionnant mon image pour éviter une erreur de type Out of Memory.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/05/2011, 18h51
  2. Erreur system out of memory
    Par Honemo dans le forum Windows Forms
    Réponses: 7
    Dernier message: 12/02/2008, 21h27
  3. Erreur "Out Of Memory" sur application en VB4
    Par aokiseiichiro dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 18/07/2007, 17h37
  4. "out of memory exception" sur un picturebox[VB 2005.net]
    Par philippe carel dans le forum Windows Forms
    Réponses: 6
    Dernier message: 23/07/2006, 14h36

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