Изображение из галереи вращается автоматически-Android
В моем приложении для android я загружаю изображение с устройства gallery.In это, я сталкиваюсь с проблемой относительно ориентации изображения. Когда я загружаю изображения большого разрешения из галереи, они автоматически поворачиваются, а затем отображаются в моем представлении. Я пробовал различные решения этой проблемы, но не мог получить правильное решение. Я сослался на getOrientation () , и это ссылки. Я попробовал оба решения, но не смог получить желаемого результата.ExifInterface
возвращают правильные данные, но тогда они также являются не полезно, поскольку изображения поворачиваются из-за их большого разрешения, а не из-за ориентации камеры. Пожалуйста, помогите мне решить эту проблему.
Спасибо.
1 ответ:
Сделайте один класс именованным 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");
Редактировать:
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);
Спасибо!