Сборщик фотографий. Портрет превращается в пейзаж

Как выбрать изображение из галереи (SD Card) для моего приложения?

Я реализовал второй ответ (с понижением частоты дискретизации). Когда я выбираю изображение в портретной ориентации, оно будет отображаться в альбомной ориентации. Кто-нибудь знает, почему это так? И как это исправить? Заранее спасибо!

Ps Извините, я сделал новую тему из этого, но постер защищал его тему от новичков, как я:)

1 ответ

Решение

Вы должны получить exif-поворот изображения, как это, и соответствующим образом расположить свое растровое изображение.

public static int getExifRotation(String imgPath) 
{
    try 
    {
        ExifInterface exif = new ExifInterface(imgPath);
        String rotationAmount = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
        if (!TextUtils.isEmpty(rotationAmount)) 
        {
            int rotationParam = Integer.parseInt(rotationAmount);
            switch (rotationParam) 
            {
                case ExifInterface.ORIENTATION_NORMAL:
                    return 0;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    return 90;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    return 180;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    return 270;
                default:
                    return 0;
            }
        } 
        else 
        {
            return 0;
        }
    }
    catch (Exception ex) 
    {
        return 0;
    }
}

получить путь картины

public String getPath(Uri uri) {
    String[] projection = { MediaStore.Images.Media.DATA };
    Cursor cursor = managedQuery(uri, projection, null, null, null);
    int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    cursor.moveToFirst();
    return cursor.getString(column_index);
}

Тонко сделайте матрицу и используйте растровый конструктор, который использует матрицу

Matrix matrix = new Matrix();
matrix.preRotate(90); 
// or
matrix.postRotate(90);

так что внутри вашего onActivityResult вы должны иметь что-то вроде этого

 Uri selectedImageUri = data.getData();

                selectedImagePath = getPath(selectedImageUri);
                orientation = getExifRotation(selectedImagePath);


                Matrix matrix = new Matrix();
                matrix.postRotate(90);
               if(orientation == 90){
                   bitmap = Bitmap.createBitmap(bitmap, 0, 0, 
                            bitmap.getWidth(), bitmap.getHeight(), 
                            matrix, true);}

хотя сначала убедитесь, что вы изменили изображение, так как он сначала указал его, а затем сделал это

Другие вопросы по тегам