Comment faire pivoter et retourner des bitmap dans onPictureTaken
Je suis la recherche dans onPictureTaken
que l'image enregistrée est en miroir sur l'axe des y et rotation de 90 degrés dans le sens horaire, même si l'aperçu de la caméra ne l'était pas. C'est sur mon Nexus S qui est de la course 2.3.6. Le même programme en cours d'exécution sur mon Nexus 4 avec 4.2 a l'image résultante en miroir sur l'axe des y et rotation de 180 degrés dans le sens horaire.
C'est le code, je suis en cours d'exécution dans onPictureTaken
:
@Override
public void onPictureTaken(final byte[] data, Camera camera) {
Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length);
String path = MediaStore.Images.Media.insertImage(getContentResolver(), picture, "name" , "description");
Log.e("tag", "path: " + path); //prints something like "path: content://media/external/images/media/819"
try {
ExifInterface exif = new ExifInterface(path); //prints this error: "04-25 21:28:21.063: E/JHEAD(12201): can't open 'content://media/external/images/media/819'"
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Log.e("tag", "exif orientation: " + orientation); //this is outputting orientation unknown
} catch (IOException e) {
e.printStackTrace();
}
}
Quelqu'un peut me montrer comment je remédier à cela étant donné que j'ai l'impression d'obtenir des résultats différents à partir de différents appareils? Comment puis-je détecter l'orientation de l'image résultante, de sorte que je sais le faire pivoter de 90 ou de 180 degrés dans le sens antihoraire?
[MODIFIER]
J'ai ajouté un peu plus d'informations à l'aide de la ExifInterface trucs que j'ai lu à propos, mais que l'information ne semble pas pan...
Attendez, @JRowan donc, avez-vous utilisé la caméra à tous? Si oui, comment obtenez-vous l'image à partir de la caméra?
onActivityResult() avec de nouvelles Intentions(MediaStore.ACTION_IMAGE_CAPTURE);
Ah, je vois. Je ne suis pas à l'aide d'une Intention... l'aperçu de La caméra, je suis en cours d'exécution est d'être recouvertes par un autre point de vue... Donc je ne pense pas que je pourrais l'utiliser, non?
je sais que ce dont on parle, vous pouvez résoudre par le biais de l'intention par l'obtention de l'ExifInterface attribut de l'image, comment vos de le faire peut-être vous pouvez définir des ExifInterface attribut, je ne suis pas sûr
OriginalL'auteur user5243421 | 2013-04-26
Vous devez vous connecter pour publier un commentaire.
J'ai mis beaucoup de travail dans cette pensée, je vous ferais partager ma solution.
Il est testé sur un Motorola Devy, Samsung Xcover 1 et Samsung XCover 2.
Que je travaille avec un aperçu de la caméra, la solution a fondamentalement deux
pièces.
1. Prendre soin de l'aperçu de la caméra et de définir la rotation de l'extrait selon
à l'appareil de rotation.
2. Une fois qu'une photo est prise, qui est le "onPictureTaken' callback n'est appelé
rotation de l'image par l'angle adéquat, tel qu'il montre ce que l'aperçu juste
a montré.
1
Votre "surfaceChanged " méthode", dans votre aperçu de l'appareil photo (SurfaceView),
vous devrait ressembler à ceci:
où
stopPreview:
startPreview:
2
Dans votre "onPictureTaken' callback faire pivoter l'image, en utilisant le code suivant:
BitmapTools.java
C'est une grande réponse détaillée. Je n'ai pas d'utiliser votre code exactement, mais il m'a vraiment aidé à comprendre le problème, je suis donc à marquer ce que l'on a accepté la réponse. J'espère que cela aide d'autres développeurs qui ont ce problème.
Dans cette réponse, lien l'expliquer mieux.
OriginalL'auteur fabian
ici, vous allez vérifier, enregistrer l'image et peut-être que cela va fonctionner et n'oubliez pas, si(bitmap.getWidth > bitmap.getHeight()) une autre case
if(width > height)
vérifier, mais si un autre téléphone fait pivoter l'image de 270 degrés? soupirvous avez essayé cette méthode, j'utilise ce parce que quand je prend l'image de la caméra le prend et le fait pivoter de 90 degrés comment sa enregistrés, mais lorsqu'il est affiché dans la galerie, ou ce qu'il affiche la façon dont j'ai pris la photo, de sorte que l'ouverture par programmation, je dois vérifier comme ça
et j'utilise de la matrice.preRotate() ou de la matrice.postRotate() avec Bitmap.createBitmap() après l'enregistrement en fonction
c'est tout ce que je sais de l'homme, désolé si ce n'est pas assez
OriginalL'auteur JRowan
vous devez lire sur ExifInterface pour résoudre ce problème.
j'ai cette fonction dans mon application pour vérifier la météo de l'image prise à partir de la caméra doit être rotateed ou pas.
Passer le chemin de la ImageUri comme une entrée.
OriginalL'auteur strike