Android Сохранить изображение Информация Exif выходит из строя в Marshmallow 6.0.1
В моей пользовательской камере мне нужно сохранить ориентацию для захваченного изображения. Этот код отлично работает для других версий Android. Но он не работает в 6.0.1. Результат, который я получаю, является неправильным после сохранения атрибутов в файл изображения.
try {
exif = new ExifInterface(pictureFile.getAbsolutePath());
exif.setAttribute(ExifInterface.TAG_ORIENTATION, "" + orientation);
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
Ответы
Ответ 1
Попробуйте это для сохранения ориентации разных углов для снятых изображений: -
Options options = new Options();
// downsizing image as it throws OutOfMemory Exception for larger
// images
options.inSampleSize = 8;
ExifInterface exif;
try {
exif = new ExifInterface(fileUri.getPath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION, 0);
Log.d("EXIF", "Exif: " + orientation);
Matrix matrix = new Matrix();
if (orientation == 6) {
matrix.postRotate(90);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 3) {
matrix.postRotate(180);
Log.d("EXIF", "Exif: " + orientation);
} else if (orientation == 8) {
matrix.postRotate(270);
Log.d("EXIF", "Exif: " + orientation);
}
myBitmap = BitmapFactory.decodeFile(path_img, options);
myBitmap = Bitmap.createBitmap(myBitmap, 0, 0,
myBitmap.getWidth(), myBitmap.getHeight(), matrix,
true);
} catch (Exception e) {
}
Ответ 2
Поскольку у меня возникли проблемы и различное поведение, читающее информацию EXIF от разных производителей, я бы предложил вам получить ориентацию из URI сохраненного изображения, а затем вы можете сохранить его в интерфейсе EXIF.
public static void getImageOrientationFromUri(@NonNull ContentResolver contentResolver, @NonNull Uri uri) {
if (uri.getPath() == null)
throw new NullPointerException("URI Path should not be null");
float rotationInDegrees = 0;
Cursor cursor = contentResolver.query(uri, new String[]{MediaStore.Images.ImageColumns.ORIENTATION},
null,
null,
null);
if (cursor != null && cursor.moveToFirst()) {
int col = cursor.getColumnIndex(MediaStore.Images.ImageColumns.ORIENTATION);
if (col != -1)
rotationInDegrees = cursor.getInt(col);
cursor.close();
}
// here you can save to the EXIF interface getting the apropriate value from rotationInDegrees
//If you want to display the image create the bitmap using:
//Bitmap sourceBitmap = MediaStore.Images.Media.getBitmap(contentResolver, uri);
//Matrix matrix = new Matrix();
//matrix.preRotate(rotationInDegrees);
//you can change the signature of the method to return a `Bitmap` and return
//Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, false);
}
Ответ 3
Другие решения переписывают изображение вместо того, чтобы манипулировать информацией EXIF. Я бы предложил сделать это, как вы пробовали только с правильными константами:
try {
exif = new ExifInterface(pictureFile.getAbsolutePath());
exif.setAttribute(ExifInterface.TAG_ORIENTATION,
Integer.toString(ExifInterface.ORIENTATION_ROTATE_90));
exif.saveAttributes();
} catch (IOException e) {
e.printStackTrace();
}
На основе исходного кода вам нужно использовать одно из следующих значений:
-
ExifInterface.ORIENTATION_UNDEFINED
-
ExifInterface.ORIENTATION_NORMAL
-
ExifInterface.ORIENTATION_FLIP_HORIZONTAL
-
ExifInterface.ORIENTATION_ROTATE_180
-
ExifInterface.ORIENTATION_FLIP_VERTICAL
-
ExifInterface.ORIENTATION_TRANSPOSE
-
ExifInterface.ORIENTATION_ROTATE_90
-
ExifInterface.ORIENTATION_TRANSVERSE
-
ExifInterface.ORIENTATION_ROTATE_270
Ответ 4
ОБНОВЛЕНИЕ БИБЛИОТЕКИ ПОДДЕРЖКИ:
Вчера Google опубликовал 25.1.0 версию библиотеки поддержки с массовым обновлением в ExifInterface, который в основном фокусируется на чтении и записи атрибутов файла изображения в последней версии Android. Пожалуйста, посмотрите SOURCE для кода и больше понимайте это обновление.
Надеюсь, это поможет вам