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 :

Gestion de l'orientation d'une photo lors de l'enregistrement


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif
    Homme Profil pro
    Marchand de glace
    Inscrit en
    Mai 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Marchand de glace
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2012
    Messages : 88
    Par défaut Gestion de l'orientation d'une photo lors de l'enregistrement
    Bonjour,

    Voici mon problème, je n'arrive pas a enregistrer la photo dans le bon mode/format (Portrait ou Paysage) ! Elle est toujours en mode Paysage étant donnée que j'ai bloqué mon écran en Landscape.

    J'ai bien essayé ce code mais sans succès

    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
     
    			int degrees=0;
    			int rotation = AppareilPhotoActivity.this.getWindowManager().getDefaultDisplay()
                        .getOrientation();
    			switch(rotation){
    				case Surface.ROTATION_0: 
    					degrees=0;
    				break;
    				case Surface.ROTATION_90:
    					degrees=90;
    				break;
    				case Surface.ROTATION_180: 
    					degrees=180;
    				break;
    				case Surface.ROTATION_270:
    					degrees=270;
    				break;
    			}
     
    			// Metadata pour la photo
    			ContentValues values = new ContentValues();
    			values.put(Media.TITLE, fileName);
    			values.put(Media.DISPLAY_NAME, fileName);
    			values.put(Media.DESCRIPTION, "Image prise par FormationCamera");
    			values.put(Media.DATE_TAKEN, new Date().getTime());
    			values.put(Media.MIME_TYPE, "image/jpeg");
    			values.put(Media.ORIENTATION,degrees);
    En debug je me rend compte que dans le switch l'appli rentre toujours dans la cas case Surface.ROTATION_0 !

    J'ai donc essayé de forcer la variable degrees pour tester

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    values.put(Media.ORIENTATION,270);
    Mais la encore un echec cuisant ! La photo et toujours en Landscape

    Une idée ?

    Cordialement

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2012
    Messages : 149
    Par défaut
    moi j'utilise ça je sais pas si c'est très propre mais ça marche

    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
    private Bitmap orientePhoto (Bitmap b)
     	{
     		int orientation = 0;
     
    		 if(b.getHeight() < b.getWidth()){
                orientation = 90;
            } else {
                orientation = 0;
            }
     
            Bitmap bMapRotate;
            if (orientation != 0) {
                Matrix matrix = new Matrix();
                matrix.postRotate(orientation);
                bMapRotate = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
            } else
                bMapRotate = Bitmap.createScaledBitmap(b, b.getWidth(), b.getHeight(), true);
     
            return bMapRotate;
     	}
    par contre moi elle était en mode portrait mais après tu adapte le test

  3. #3
    Inactif
    Homme Profil pro
    Marchand de glace
    Inscrit en
    Mai 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Marchand de glace
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2012
    Messages : 88
    Par défaut
    Bonjour

    Et merci pour ce bout de code qui marche a merveille mais sur un Bitmap...
    Lorsque j'enregistre ma photo j'utilise ceci

    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
     
    			public void onPictureTaken(byte[] data, Camera camera) {
     
    				if (data != null) {
    					// Enregistrement de votre image
     
    					try {
    						if (stream != null) {
    							stream.write(data);
    							stream.flush();
    							stream.close();
    						}
    					} catch (Exception e) {
    						// TODO: handle exception
    					}
     
    					// On redémarre la prévisualisation
    					camera.startPreview();
     
    					affiche_boite_de_dialogue();
     
    				}
    			}
    J'ai donc un byte[] et non un Bitmap

    J'ai donc essayé de faire une conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    					Bitmap bMap = BitmapFactory.decodeByteArray(data, 0, data.length);
     
    					bMap = orientePhoto(bMap);
     
    					ByteArrayOutputStream stream = new ByteArrayOutputStream();
    					bMap.compress(Bitmap.CompressFormat.PNG, 100, stream);
    					data = stream.toByteArray();
    Mais la mon application plante =(

    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
     
    05-16 11:27:53.265: E/AndroidRuntime(6793): FATAL EXCEPTION: main
    05-16 11:27:53.265: E/AndroidRuntime(6793): java.lang.OutOfMemoryError
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:93)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:203)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at java.io.OutputStream.write(OutputStream.java:82)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at com.test.android.AppareilPhotoActivity$1.onPictureTaken(AppareilPhotoActivity.java:246)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at android.hardware.Camera$EventHandler.handleMessage(Camera.java:618)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at android.os.Looper.loop(Looper.java:132)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at android.app.ActivityThread.main(ActivityThread.java:4134)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at java.lang.reflect.Method.invokeNative(Native Method)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at java.lang.reflect.Method.invoke(Method.java:491)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
    05-16 11:27:53.265: E/AndroidRuntime(6793): 	at dalvik.system.NativeStart.main(Native Method)
    Si il n'y a pas d'autres solutions j'ai pensé a enregistrer le fichier comme je le fais, le récupérer, l'orienter et écraser le précédent mais en dernier recours !

    Si quelqu'un a une idée !

  4. #4
    Inactif
    Homme Profil pro
    Marchand de glace
    Inscrit en
    Mai 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Marchand de glace
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2012
    Messages : 88
    Par défaut
    Pour l'appel de la fonction j'ai trouvé une solution , ma photo est ensuite uploadé sur un serveur web, je récupère donc mon image dans un Bitmap et je l'oriente a ce moment la !

    Mais en fait cette fonction ne règle pas mon problème entierement ! Car elle oriente la photo si elle est en mode paysage (Largeur > hauteur) Or dans mon cas toutes mes photos sont dans ce cas !

    Il faudrait donc récupérer l'orientation de la tablette !

    Si tablette en paysage {
    On ne fait rien
    }si tablette en portrait{
    On oriente
    }

    Quelqu'un a suivi ?

  5. #5
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Yep j'ai suivi ,et après une recherche sur le forum

    http://www.developpez.net/forums/d11...hoto-jpg-sens/


    Quand au OutOfMemory normalement tourner l'image ne pose pas de problème J'aimerais bien voir comment tu tournes l'image ? .

  6. #6
    Inactif
    Homme Profil pro
    Marchand de glace
    Inscrit en
    Mai 2012
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Marchand de glace
    Secteur : Alimentation

    Informations forums :
    Inscription : Mai 2012
    Messages : 88
    Par défaut
    Bonjour,

    Merci pour votre réponse, j'avais déjà vu ce post mais il ne m'avait apporté aucune solution, je m'explique :

    La prise de la photo n'est pas faite par l'appelle a l'appareil photo android mais a un Surface View personnalisé. (Cela enleve pas mal de piste).

    Pour ce qui est de http://stackoverflow.com/questions/3...110406#5110406, j'ai bien essayé (voir premier mon premier message) mais l'orientation est toujours égale à 0. Est ce parce que je force l'application en landscape ? Le capteur peut il être désactivé ? J'ai réessayé ce matin avec des toasts il m'affiche tout le temps 0 =(

    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
     
     
    			Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
     
    			if(display.getRotation() == Surface.ROTATION_0)
    	        {
    				Toast.makeText(this, "0", Toast.LENGTH_SHORT).show();
    	        }
     
    	        if(display.getRotation() == Surface.ROTATION_90)
    	        {
    	        	Toast.makeText(this, "90", Toast.LENGTH_SHORT).show();                          
    	        }
     
    	        if(display.getRotation() == Surface.ROTATION_180)
    	        {
    	        	Toast.makeText(this, "180", Toast.LENGTH_SHORT).show();            
    	        }
     
    	        if(display.getRotation() == Surface.ROTATION_270)
    	        {
    	        	Toast.makeText(this, "270", Toast.LENGTH_SHORT).show();
    	        }
    Pour ce qui est de l'orientation de la photo j'utilise le code que m'a donné Cedric_G

    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
     
     
    private Bitmap orientePhoto (Bitmap b)
     	{
     		int orientation = 0;
     
    		 if(b.getHeight() < b.getWidth()){
                orientation = 90;
            } else {
                orientation = 0;
            }
     
            Bitmap bMapRotate;
            if (orientation != 0) {
                Matrix matrix = new Matrix();
                matrix.postRotate(orientation);
                bMapRotate = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
            } else
                bMapRotate = Bitmap.createScaledBitmap(b, b.getWidth(), b.getHeight(), true);
     
            return bMapRotate;
     	}
    Désolé pour ma réponse tardive !

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

Discussions similaires

  1. [Entité-Association] Gestion des orientations d'une faculté
    Par massihazard dans le forum Schéma
    Réponses: 3
    Dernier message: 29/03/2014, 09h25
  2. Orientation d'une photo
    Par PIEPLU dans le forum Langage
    Réponses: 3
    Dernier message: 06/08/2012, 19h08
  3. Bitmap/EXIF : Sens d'une photo suivant l'orientation de l'appareil
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 01/09/2010, 20h43
  4. [AC-2007] Selectionner la valeur unique d'une ZL lors de l'enregistrement
    Par wushu29 dans le forum IHM
    Réponses: 2
    Dernier message: 03/05/2010, 13h40
  5. Réponses: 5
    Dernier message: 04/04/2003, 15h02

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