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.
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}
.
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;
}
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);