Définir l'orientation de l'image à L'aide D'ExifInterface

setRotation method dans Camera.Parameters ne fonctionne pas dans tous les appareils. Quelqu'un suggère de modifier manuellement l'information EXIF pour résoudre le problème. Pouvez-vous me donner un petit exemple sur la façon de définir l'information exif avec ExifInterface de manière à définir l'orientation de l'image comme portrait?

private int savePicture(byte[] data)
{
       File pictureFile = getOutputMediaFile();
       if (pictureFile == null)
           return FILE_CREATION_ERROR;

       try {
           FileOutputStream fos = new FileOutputStream(pictureFile);
           fos.write(data);
           fos.close();
       } catch (FileNotFoundException e) {
           return FILE_NOT_FOUND;
       } catch (IOException e) {
           return ACCESSING_FILE_ERROR;
       }

   return OKAY;
}

j'ai essayé avec ceci:

    try {
        ExifInterface exifi = new ExifInterface(pictureFile.getAbsolutePath());
        exifi.setAttribute(ExifInterface.TAG_ORIENTATION, String.valueOf(ExifInterface.ORIENTATION_ROTATE_90));
        exifi.saveAttributes();
    } catch (IOException e) {
        Log.e(TAG, "Exif error");
    }

mais rien ne change quand je visualise les photos de la galerie android.

6
demandé sur user2923045 2013-11-03 18:15:52

3 réponses

pour ceux qui veulent réellement écrire ces informations EXIF, voici un peu de code:

ExifInterface exifInterface = new ExifInterface(someFile.getPath());
exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION,
                           String.valueOf(orientation));
exifInterface.saveAttributes();

alors que orientation est l'une des orientations standard, c'est-à-dire ExifInterface.ORIENTATION_ROTATE_{90,180,270} .

8
répondu Thomas Keller 2017-03-02 16:30:32

si l'orientation est sauvegardée dans le fichier mais n'apparaît pas dans la galerie, il se peut qu'elle soit mise en cache dans MediaStore. Vous devez donc essayer de mettre à jour cette information là aussi.

voici le code snipped (non testé)

/**
 * @param fileUri the media store file uri
 * @param orientation in degrees 0, 90, 180, 270
 * @param context
 * @return
 */
public boolean setOrientation(Uri fileUri, int orientation, Context context) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Images.Media.ORIENTATION, orientation);
    int rowsUpdated = context.getContentResolver().update(fileUri, values, null, null);
    return rowsUpdated > 0;
}

/**
 * Get content uri for the file path
 * 
 * @param path
 * @param context
 * @return
 */
public Uri getContentUriForFilePath(String path, Context context) {
    String[] projection = {
        MediaStore.Images.Media._ID
    };
    Cursor cursor = context.getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, projection,
            MediaStore.Images.Media.DATA + " = ?", new String[] {
                path
            }, null);
    Uri result = null;
    if (cursor != null) {
        try {
            if (cursor.moveToNext()) {
                long mediaId = cursor.getLong(0);
                result = ContentUris.withAppendedId(
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI, mediaId);
            }
        } finally {
            cursor.close();
        }
    }
    return result;
}
3
répondu httpdispatch 2014-03-13 06:59:46

Eh bien, j'étais coincé dans ce genre de problème, et j'ai essayé la solution sur laquelle vous travaillez et j'ai fini par utiliser la fonction de matrice.

quelles que soient les images que je prenais, c'était tout un paysage, donc dans app j'ai juste appliqué le code ci-dessous, et ça a bien fonctionné: -

Matrix matrix = new Matrix();
//set image rotation value to 90 degrees in matrix.
matrix.postRotate(90);
//supply the original width and height, if you don't want to change the height and width of //bitmap.
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0, newWidth, newHeight, matrix, true);
1
répondu Bette Devine 2013-11-03 15:27:04