Захваченная фотография ориентация меняется в Android

Я открываю приложение камеры одним нажатием кнопки. И отображение захваченного фото в следующем упражнении. Но захваченное фото поворачивается на 90 градусов. Когда я отображаю изображение в виде после того, как я его захватил, его ориентация всегда является горизонтальной. Почему фотография не отображается на портрете, как на фотографии, сделанной в портретном режиме?

Нажатие кнопки:

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(APP_DIR+"/latest.png")));       
startActivityForResult(i, CAPTURE_PHOTO_CONSTANT);

Внутри на Actvityresult:

bmp = BitmapFactory.decodeFile(APP_DIR+"/latest.png");
startActivity(new Intent(this, DisplayActivity.class));

Отображение захваченного фото:

photoViewRelativeLayout.setBackgroundDrawable(new BitmapDrawable(getResources(), CaptureActivity.bmp));
 Shirish Herwade23 авг. 2016 г., 09:46
 bummi29 сент. 2014 г., 13:38

Ответы на вопрос(4)

име, все работает отлично, как и раньше. Если я делаю фотографию в портретном режиме, мне нужно перевернуть камеру, и картинка выглядит хорошо. Если вы заметили, я немного изменил ваш код, добавив & quot; ExifInterface & quot; перед каждой ориентацией. Я использовал следующий код:

    try {
      ExifInterface exif = new ExifInterface(filename); 
      int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 
                          ExifInterface.ORIENTATION_NORMAL);
      int rotate = 0;
         switch(orientation) {
            case  ExifInterface.ORIENTATION_ROTATE_270:
                 rotate-=90;break;
            case  ExifInterface.ORIENTATION_ROTATE_180:
                 rotate-=90;break;
            case  ExifInterface.ORIENTATION_ROTATE_90:
                 rotate-=90;break;
            }
              Log.d("Fragment", "EXIF info for file " + filename + ": " + rotate);
         } catch (IOException e) {
             Log.d("Fragment", "Could not get EXIF info for file " + filename + ": " + e);
         }
Решение Вопроса

телефоны Samsung установили тег ориентации EXIF, а не вращение отдельных пикселей. Чтение растрового изображения с использованием BitmapFactory не поддерживает этот тег. Как я обнаружил, решение этой проблемы заключалось в использовании ExifInterface в onActivityResult Метод действия. Который проверяет ориентацию, связанную с URI захваченного изображения с камеры.

                        int rotate = 0;
                        try {
                            getContentResolver().notifyChange(imageUri, null);
                            File imageFile = new File(imagePath);
                            ExifInterface exif = new ExifInterface(
                                    imageFile.getAbsolutePath());
                            int orientation = exif.getAttributeInt(
                                    ExifInterface.TAG_ORIENTATION,
                                    ExifInterface.ORIENTATION_NORMAL);

                            switch (orientation) {
                            case ExifInterface.ORIENTATION_ROTATE_270:
                                rotate = 270;
                                break;
                            case ExifInterface.ORIENTATION_ROTATE_180:
                                rotate = 180;
                                break;
                            case ExifInterface.ORIENTATION_ROTATE_90:
                                rotate = 90;
                                break;
                            }
                            Log.v(Common.TAG, "Exif orientation: " + orientation);
                        } catch (Exception e) {
                            e.printStackTrace();
                        }

                        /****** Image rotation ****/
                        Matrix matrix = new Matrix();
                        matrix.postRotate(orientation);
                        Bitmap cropped = Bitmap.createBitmap(scaled, x, y, width, height, matrix, true);
 14 июн. 2012 г., 14:59
вам нужно повернуть растровое изображение в конце.
 Santhosh14 июн. 2012 г., 13:44
Нужно ли вращать растровое изображение в конце?
 15 июн. 2012 г., 09:27
В других устройствах int direction = exif.getAttributeInt (ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); функция возвращает угол 0, поэтому оператор switch никогда не вызывается, поэтому ориентация остается неизменной.
 30 апр. 2014 г., 11:42
Я столкнулся с серьезной проблемой с кодом .. Samsung Galaxy S4 устройство перезапускается .. Вы можете мне помочь? почему это происходит?
 Santhosh14 июн. 2012 г., 15:34
Благодарю. Оно работает. Но у меня есть небольшое сомнение. Мы поворачиваем изображение после захвата. Поворачивает ли он фотографию, сделанную не на устройствах Samsung? Что, если фотография будет правильно снята на устройстве XXXX?

используйте вместо Glide. Он сам определяет ориентацию и не зависит от используемого вами мобильного телефона. Вот образец

Glide.with(_c).load(horizontalList.get(position).imagePath).into(holder.img_injury);

получить ориентацию изображения, полученного с помощью этого кода в onActvityresult ....

File imageFile = new File(imageUri.toString());
       ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
       int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
       int rotate = 0;
       switch(orientation) {
         case ORIENTATION_ROTATE_270:
             rotate-=90;break;
         case ORIENTATION_ROTATE_180:
             rotate-=90;break
         case ORIENTATION_ROTATE_90:
             rotate-=90;break
       }
 03 июл. 2015 г., 08:18
Какие значения ORIENTATION_ROTATE_270, ORIENTATION_ROTATE_180 и ORIENTATION_ROTATE_90, которые я получаю, не могут устранить ошибку символа для всех них.

Ваш ответ на вопрос