-
-
Save Asutosh11/2f1f8205dc5c1990c0218a47137e1fcd to your computer and use it in GitHub Desktop.
For photos taken from camera - fix flipped / rotated image by getting EXIF orientation for Bitmaps.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.IOException; | |
import java.lang.reflect.Constructor; | |
import java.lang.reflect.Field; | |
import java.lang.reflect.InvocationTargetException; | |
import java.lang.reflect.Method; | |
import android.graphics.Bitmap; | |
import android.graphics.Matrix; | |
import android.os.Build; | |
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; | |
} | |
} | |
/** | |
How to use it? | |
-------------- | |
String imagePath = photoFile.getAbsolutePath(); | |
Bitmap myBitmap = BitmapFactory.decodeFile(imagePath); | |
Bitmap orientedBitmap = ExifUtil.rotateBitmap(imagePath, myBitmap); | |
*/ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment