Подтвердить что ты не робот

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();
}
4b9b3361

Ответ 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 для кода и больше понимайте это обновление.

Надеюсь, это поможет вам