Импорт галереи Android

Я использую средство выбора галереи для выбора изображения из галереи. Фотографии, сделанные камерой в портретном режиме, отображаются в галерее как прямые. Но когда я импортирую фотографии, я получаю фотографию повернутой (пейзажной). Только в галерее эта картинка отображается как прямая. Как справиться с этой проблемой? Я хочу, чтобы все фотографии были в фактической ориентации. заранее спасибо

private void addImageFromGallery() {

    Intent intent = new Intent();
    intent.setType("image/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select Picture"),
            GALLERY_CODE);

}

person Zacharias Manuel    schedule 02.02.2012    source источник
comment
Галерея знает точную ориентацию телефона во время съемки. Так он поворачивает картинку. Но я этого не понимаю.   -  person Zacharias Manuel    schedule 02.02.2012
comment
Это руководство может вам помочь   -  person    schedule 24.10.2013


Ответы (2)


Получил ответ. Ориентация сохраняется вместе с изображением в формате EXIF. Мы должны прочитать тег Orientation данных для каждого изображения.

public static float rotationForImage(Context context, Uri uri) {
        if (uri.getScheme().equals("content")) {
        String[] projection = { Images.ImageColumns.ORIENTATION };
        Cursor c = context.getContentResolver().query(
                uri, projection, null, null, null);
        if (c.moveToFirst()) {
            return c.getInt(0);
        }
    } else if (uri.getScheme().equals("file")) {
        try {
            ExifInterface exif = new ExifInterface(uri.getPath());
            int rotation = (int)exifOrientationToDegrees(
                    exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_NORMAL));
            return rotation;
        } catch (IOException e) {
            Log.e(TAG, "Error checking exif", e);
        }
    }
        return 0f;
    }

    private static float exifOrientationToDegrees(int exifOrientation) {
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) {
        return 90;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {
        return 180;
    } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {
        return 270;
    }
    return 0;
}
}

Значение поворота можно использовать для исправления ориентации фотографии следующим образом:

Matrix matrix = new Matrix();
float rotation = PhotoTaker.rotationForImage(context, uri);
if (rotation != 0f) {
      matrix.preRotate(rotation);
 }

Bitmap resizedBitmap = Bitmap.createBitmap(
 sourceBitmap, 0, 0, width, height, matrix, true);
person Zacharias Manuel    schedule 06.02.2012
comment
Отлично работает... Bitmap resizedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, sourceBitmap.getWidth(), sourceBitmap.getHeight(), matrix, true); - person Underdog; 23.08.2012
comment
Почему вращениеForImage возвращает число с плавающей запятой? Разве int не достаточно? - person Braden Steffaniak; 26.05.2016

при настройке изображения проверьте, больше ли ширина изображения высоты или нет, и при необходимости поверните его на 90

person Seshu Vinay    schedule 02.02.2012
comment
Это невозможно, потому что мы получаем все изображение в соотношении 640X480. - person Zacharias Manuel; 02.02.2012
comment
Получил ответ... Метка ориентации сохраняется с каждым изображением. Проверьте эту ссылку mobisocial.stanford.edu/news/2011/ 08/вращающиеся изображения в Android - person Zacharias Manuel; 06.02.2012
comment
опубликуйте свой ответ. Будет полезно другим - person Seshu Vinay; 06.02.2012