4

В моем приложении для Android я загружаю изображение из галереи устройств. В этом я сталкиваюсь с проблемой ориентации изображения. Когда я загружаю изображения с большим разрешением из галереи, они автоматически поворачиваются, а затем отображаются на мой взгляд. Я пробовал различные решения по этой проблеме, но не мог найти правильное решение. Я ссылался на getOrientation() и this ссылки. Я попробовал оба решения, но не смог получить желаемый результат. ExifInterface возвращает правильные данные, но затем они также не помогают, поскольку изображения вращаются из-за их большого разрешения не из-за ориентации камеры. Пожалуйста, помогите мне решить это решение.Изображение из галереи автоматически поворачивается - Android

спасибо.

ответ

24

Make один класс с именем ExifUtils

public class ExifUtils { 
/** 
* @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; 
} 

Теперь вы можете вызвать его в деятельности по:

ExifUtils.rotateBitmap("your Image path here", "your bitmap object here"); 

EDIT:

public void decodeFile(String filePath) { 

    // Decode image size 
    BitmapFactory.Options o = new BitmapFactory.Options(); 
    o.inJustDecodeBounds = true; 
    BitmapFactory.decodeFile(filePath, o); 

    // The new size we want to scale to 
    final int REQUIRED_SIZE = 1024; 

    // Find the correct scale value. It should be the power of 2. 
    int width_tmp = o.outWidth, height_tmp = o.outHeight; 
    int scale = 1; 
    while (true) { 
     if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) 
      break; 
     width_tmp /= 2; 
     height_tmp /= 2; 
     scale *= 2; 
    } 

    // Decode with inSampleSize 
    BitmapFactory.Options o2 = new BitmapFactory.Options(); 
    o2.inSampleSize = scale; 
    Bitmap b1 = BitmapFactory.decodeFile(filePath, o2); 
    Bitmap b= ExifUtils.rotateBitmap(filePath, b1); 

    // image.setImageBitmap(bitmap); 
} 

сейчас позвоните по этому методу

decodeFile(imagepath); 

Спасибо!

+0

Я назвал это в своей деятельности следующим образом: 'Bitmap b1 = BitmapFactory.decodeFile (imagePath); b = ExifUtils.rotateBitmap (imagePath, b1); 'но не работает. Я думаю, что ваше решение правильно, потому что в классе ExifUtil он выполняет «случай 6», что является правильным. Я не знаю, почему не работает. – zanky

+0

Ya..s right ... – Piyush

+0

Stil это показывает пейзаж изображения. – zanky

Смежные вопросы