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

  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 !

  7. #7
    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
    Bonjour,

    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).
    J'avais bien compris mais depuis le post il y a quelque pistes sur le sujet que d'ailleurs tu as fait (la rotation )

    Pour ce qui est de l'orientation de la photo j'utilise le code que m'a donné Cedric_G
    Comme quoi le copier coller n'est jamais bon.

    Il faut que tu libère tes Bitmaps sinon la mémoire allouée ne sera jamais libérée.
    Euh de mémoire je crois que c'est la fonction recycle() a utilisé
    http://developer.android.com/referen...html#recycle()


    Après pour récupérer l'orientation, soit essaye de passer par la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void onConfigurationChanged(Configuration newConfig) {

    Ou alors tu as un listener sur l'orientation du téléphone !
    http://developer.android.com/referen...nListener.html

  8. #8
    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
    Merci bien je vais voir ses deux nouvelles pistes !

  9. #9
    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
    J'ai trouvé une solution à mon problème !

    Le fait de bloquer la fenêtre en landscape ne permet pas de savoir le mode (portrait ou paysage de la tablette).

    J'ai donc implémenter la méthode

    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
    33
    34
    35
    36
     
     
    	public void onConfigurationChanged(Configuration newConfig) {
    		super.onConfigurationChanged(newConfig);
     
    		camera.stopPreview();
    		no_orientation=false;
     
            Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
     
    		if(display.getRotation() == Surface.ROTATION_0)
            {
    			camera.setDisplayOrientation(0);
    			rotation=0;
            }
     
            if(display.getRotation() == Surface.ROTATION_90)
            {
            	camera.setDisplayOrientation(270);
            	rotation=270;
            }
     
            if(display.getRotation() == Surface.ROTATION_180)
            { 
            	camera.setDisplayOrientation(180);
            	rotation=181;
            }
     
            if(display.getRotation() == Surface.ROTATION_270)
            {
            	camera.setDisplayOrientation(90);
            	rotation=90;
            }
     
            camera.startPreview();
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            <activity
                android:name=".AppareilPhotoActivity"
                android:label="@string/app_name"
                android:configChanges="orientation">
    Et grâce a la méthode de Cedric_G je peux effectuer une rotation de l'image !

    Par contre je perd énormément de fluidité car des que la tablette tourne la Surface View est rechargé ! (ce qui n'est pas le cas quand on bloque la vue)

    Merci a tous !

  10. #10
    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
    Bonjour,
    Par contre je perd énormément de fluidité car des que la tablette tourne la Surface View est rechargé ! (ce qui n'est pas le cas quand on bloque la vue)
    C'est pour cela que je t'avais indiqué que tu avais un listener

    Ou alors tu as un listener sur l'orientation du téléphone !
    Il te suffira juste après de définir dans quel range tu appartiens pour en déduire la position du téléphone .

  11. #11
    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
    Je vais creuser sur la deuxième piste alors merci bien !! =)

  12. #12
    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
    J'ai trouvé ce code qui semble correspondre au listener

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    		    public void onOrientationChanged(int orientation) {       
    		        android.hardware.Camera.CameraInfo info = 
    		            new android.hardware.Camera.CameraInfo();
    		        android.hardware.Camera.getCameraInfo(BIND_AUTO_CREATE, info);     
    		        orientation = (orientation + 45) / 90 * 90;     
    		        int rotation = 0;     
    		        if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {         
    		            rotation = (info.orientation - orientation + 360) % 360;     
    		        } else {  // back-facing camera         
    		            rotation = (info.orientation + orientation) % 360;     
    		        }     
    				mParameters.setRotation(rotation); 
    		    }
    Le problème est à la dernière ligne !
    mParameters est une Vue or je ne sais pas comment récuperer la vue de mon activité !

+ 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, 10h25
  2. Orientation d'une photo
    Par PIEPLU dans le forum Langage
    Réponses: 3
    Dernier message: 06/08/2012, 20h08
  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, 21h43
  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, 14h40
  5. Réponses: 5
    Dernier message: 04/04/2003, 16h02

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