web-dev-qa-db-fra.com

setRotation (90) pour prendre une photo en mode portrait ne fonctionne pas sur les appareils Samsung

Selon la documentation, setRotation (90) devrait faire pivoter l'image JPEG capturée ( takePicture en mode paysage.

Cela fonctionne bien sur un téléphone HTC, mais ne fonctionne pas sur Samsung Google Nexus S et Samsung Galaxy S3. Est-ce un bug?

Je sais que je peux utiliser la rotation de transformation matricielle, mais je souhaite que le système d'exploitation puisse le faire plus efficacement, et je ne veux pas risquer de trop tourner sur certains autres appareils.

modifier

Le réglage de camera.setDisplayOrientation(90); faisait passer l'aperçu en mode portrait, mais cela n'avait aucun effet sur la photo prise.

De plus, Outre setRotation, j'ai également essayé de définir la taille de l'image - où je retourne h avec w: parameters.setPictureSize(1200, 1600);. Cela n'a également eu aucun effet.

solution

Apparemment, les téléphones Samsung définissent la balise d'orientation EXIF, plutôt que de faire pivoter les pixels individuels. Comme suggéré par ariefbayu, la lecture du bitmap à l'aide de BitmapFactory ne prend pas en charge cette balise. Son exemple de code est la solution, et cette solution est également compatible avec l'utilisation de inSampleSize.

36
tofi9

J'essaie de répondre à cela par rapport à la balise Exif. C'est ce que j'ai fait:

Bitmap realImage = BitmapFactory.decodeStream(stream);

ExifInterface exif=new ExifInterface(getRealPathFromURI(imagePath));

Log.d("EXIF value", exif.getAttribute(ExifInterface.TAG_ORIENTATION));
if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("6")){

    realImage=ImageUtil.rotate(realImage, 90);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("8")){
    realImage=ImageUtil.rotate(realImage, 270);
}else if(exif.getAttribute(ExifInterface.TAG_ORIENTATION).equalsIgnoreCase("3")){
    realImage=ImageUtil.rotate(realImage, 180);
}

Le ImageUtil.rotate():

public static Bitmap rotate(Bitmap bitmap, int degree) {
    int w = bitmap.getWidth();
    int h = bitmap.getHeight();

    Matrix mtx = new Matrix();
    mtx.postRotate(degree);

    return Bitmap.createBitmap(bitmap, 0, 0, w, h, mtx, true);
}
34
ariefbayu

Liso22, le flux variable ne fait aucune différence, il suffit de brancher votre bitmap, comme vous l'avez obtenu (decodeFile, etc.). Et si vous rencontrez des problèmes avec "ImageUtil.rotate (), écrivez simplement le" bitmap public statique rotation () "comme méthode avec les mêmes paramètres et faites" vraie image "égale. Quoi qu'il en soit, cette solution ne semble pas fonctionner pour moi, la balise exif renvoie 1 (normal) que ce soit en portrait ou en paysage.

3
edid