Created
March 7, 2012 00:16
-
-
Save 9re/1990019 to your computer and use it in GitHub Desktop.
fix flipped / rotated image by getting exif orientation
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; | |
} | |
} |
Awesome. Thanks man
Thank you!
Perfect. Just dont forget to delete bitmap.recycle() line if you gonna use bitmap variable again in the future.
I get this error: error: variable photoFile might not have been initialized.
I am using this code as follows:
String imagePath = photoFile.getAbsolutePath(); // photoFile is a File class.
Bitmap myBitmap = BitmapFactory.decodeFile(imagePath);
Bitmap orientedBitmap = ExifUtil.rotateBitmap(imagePath, myBitmap);
Xamarin.Android variant here.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you