-
-
Save SeptiyanAndika/5d5120699345b7426907 to your computer and use it in GitHub Desktop.
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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment