2016-08-01 3 views
0

В моем приложении изображение поворачивается при нажатии на камеру в портретном режиме, это происходит только для устройства samsung, а для остальных он отлично работает. Я внедрено следующий код после исследования переполнение стека:Изображение поворачивается при нажатии на камеру только в устройстве Samasung.

ExifInterface ei = new ExifInterface(imgFile.getPath()); 
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

switch (orientation) { 
case ExifInterface.ORIENTATION_UNDEFINED: 
mBitmap = rotateImage(bitmap, 90); 
break; 
} 

Этот код помогает мне решить эту проблему в самсунг, но теперь, когда изображение щелкнул из камеры он становится повернутой в других устройствах из-за этого куска кода.

Пожалуйста, дайте мне знать, как я могу исправить эту проблему.

+0

Насколько документаций идет: 'getAttributeInt' "Возвращает целочисленное значение указанного тега. Если в файле изображения нет такого тега или значение не может быть проанализировано как целое, return defaultValue. "Это означает, что либо тег не определен, и возвращается ExifInterface.ORIENTATION_UNDEFINED (0), либо ваш коммутатор не обрабатывает случаи ORIENTATION_ (что-то). Добавьте предложение по умолчанию и верните «ориентация». – Bonatti

+0

Хорошо спасибо много .. сделаю это .. Я проверил значение ориентации перед тем, как переключить его. 0 .. – Keshav1234

+0

Также обратите внимание, что эта «проблема» старая, [с 2012 года] (http://stackoverflow.com/ вопросы/13245556/exif-orientation-tag-value-always-0-for-image-taken-with-portrait-camera-app-and) известно, что Samsung не будет корректно сохранять данные Exif. [Даже стандарт Exif] (https://en.wikipedia.org/wiki/Exchangeable_image_file_format#Problems) имеет проблемы, которые создают случаи несовместимости. Поскольку Samsung не почитает интерфейс Exif, вы можете отредактировать этот параметр самостоятельно (если вы запрашиваете намерение камеры, используйте ориентацию устройства) или проверьте высоту/ширину растрового изображения и соответствующим образом переверните изображение. – Bonatti

ответ

0

Если вы уверены, что это проблема только с устройством Samsung, вы можете проверить устройство и добавить его в состояние if (...). Библиотека This может оказать большую помощь.

также взглянуть на ответ Джареда Rummler, чтобы this вопрос:

Но если это устройство конкретный вопрос, это может произойти на других устройствах или в конечном счете тоже может быть исправлено в более новых обновлениях Samsung OS устройства. Держите хорошую проверку на этом.

0

проход возвращающие градусов для преобразования растрового изображения,

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; 
    } 
+0

Я всегда получаю количество вращения как 0. Поэтому он всегда поворачивается – Keshav1234

+0

проверяет его обновленный код, получайте поворот на основе изображений, сначала получите местоположение изображения, затем найдите искомое требование растрового изображения , – prakash

0

Использование ниже класса

String path="path of your image"; 

imageview.setImageBitmap(ExifUtil.rotateBitmap(path, BitmapFactory.decodeFile(path))); 

ExifUtil.java

public class ExifUtil { 
    /** 
    * @see http://sylvana.net/jpegcrop/exif_orientation.html 
    */ 
    public static Bitmap rotateBitmap(String src, Bitmap bitmap) { 
     try { 
      int orientation = getExifOrientation(src); 

      if (orientation == 1) { 
       return bitmap; 
      } 

      Matrix matrix = new Matrix(); 
      switch (orientation) { 
      case 2: 
       matrix.setScale(-1, 1); 
       break; 
      case 3: 
       matrix.setRotate(180); 
       break; 
      case 4: 
       matrix.setRotate(180); 
       matrix.postScale(-1, 1); 
       break; 
      case 5: 
       matrix.setRotate(90); 
       matrix.postScale(-1, 1); 
       break; 
      case 6: 
       matrix.setRotate(90); 
       break; 
      case 7: 
       matrix.setRotate(-90); 
       matrix.postScale(-1, 1); 
       break; 
      case 8: 
       matrix.setRotate(-90); 
       break; 
      default: 
       return bitmap; 
      } 

      try { 
       Bitmap oriented = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
       bitmap.recycle(); 
       return oriented; 
      } catch (OutOfMemoryError e) { 
       e.printStackTrace(); 
       return bitmap; 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return bitmap; 
    } 

    private static int getExifOrientation(String src) throws IOException { 
     int orientation = 1; 

     try { 
      /** 
      * if your are targeting only api level >= 5 
      * ExifInterface exif = new ExifInterface(src); 
      * orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); 
      */ 
      if (Build.VERSION.SDK_INT >= 5) { 
       Class<?> exifClass = Class.forName("android.media.ExifInterface"); 
       Constructor<?> exifConstructor = exifClass.getConstructor(new Class[] { String.class }); 
       Object exifInstance = exifConstructor.newInstance(new Object[] { src }); 
       Method getAttributeInt = exifClass.getMethod("getAttributeInt", new Class[] { String.class, int.class }); 
       Field tagOrientationField = exifClass.getField("TAG_ORIENTATION"); 
       String tagOrientation = (String) tagOrientationField.get(null); 
       orientation = (Integer) getAttributeInt.invoke(exifInstance, new Object[] { tagOrientation, 1}); 
      } 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InstantiationException e) { 
      e.printStackTrace(); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchFieldException e) { 
      e.printStackTrace(); 
     } 

     return orientation; 
    } 
} 
+0

Ваша проблема исправлена? –