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

  1. #1
    Membre habitué
    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
    Points : 161
    Points
    161
    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 habitué
    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
    Points : 159
    Points
    159
    Par défaut
    Pour redimensionner, tu peux utiliser les Matrix

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    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 habitué
    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
    Points : 161
    Points
    161
    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 actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    334
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    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 habitué
    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
    Points : 161
    Points
    161
    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.

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

    Informations forums :
    Inscription : Septembre 2007
    Messages : 334
    Points : 218
    Points
    218
    Par défaut
    J'ai déjà eu ce souci, ça venait du fait que je gardais en mémoire la grande image.

    Je te donne cette méthode de redimensionnement qui résoudra peut être ton problème.
    Elle utilise une matrice comme préconisé par LordDaedalus.

    Code java : 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
    public static Bitmap scale(Bitmap source, int maxSize) {
    	// valeurs initiales
    	int width = source.getWidth();
    	int height = source.getHeight();
    	// paramettre de redimensionnement
    	float scaleWidth;
    	float scaleHeight;
    	// choix de la taille max en fonction de la disposition de l'image
    	if (width > height) {
    		scaleWidth = ((float) maxSize) / width;
    		scaleHeight = scaleWidth;
    	} else {
    		scaleHeight = ((float) maxSize) / height;
    		scaleWidth = scaleHeight;
    	}
    	// createa matrix for the manipulation
    	Matrix matrix = new Matrix();
    	// resize the bit map
    	matrix.postScale(scaleWidth, scaleHeight);
    	// recreate the new Bitmap
    	Bitmap resizedBitmap = Bitmap.createBitmap(source, 0, 0, width, height,
    				matrix, true);
    	//
    	return resizedBitmap;
    }

  8. #8
    Membre habitué
    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
    Points : 161
    Points
    161
    Par défaut
    J'ai essayé votre méthode mais la je retrouve l'erreur type "Out of Memory" à l'entrée de votre méthode scale(), voici comment je l'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     mImageBitmap = scale(BitmapFactory.decodeFile(picturePath),600);
    Voyez vous une mauvaise utilisation ?

  9. #9
    Membre habitué
    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
    Points : 161
    Points
    161
    Par défaut
    EDIT : Merci c'est résolu

+ 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