Image Orientation - Android
android, bitmap, exif, image, java
Solution
You need to account for all orientations not just 90 or 180. I am using this
File curFile = new File("path-to-file"); // ... This is an image file from my device.
Bitmap rotatedBitmap;
try {
ExifInterface exif = new ExifInterface(curFile.getPath());
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
int rotationInDegrees = exifToDegrees(rotation);
Matrix matrix = new Matrix();
if (rotation != 0f) {matrix.preRotate(rotationInDegrees);}
rotatedBitmap = Bitmap.createBitmap(bitmap,0,0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}catch(IOException ex){
Log.e(TAG, "Failed to get Exif data", ex);
}
and:
/**
* Gets the Amount of Degress of rotation using the exif integer to determine how much
* we should rotate the image.
* @param exifOrientation - the Exif data for Image Orientation
* @return - how much to rotate in degress
*/
private static int exifToDegrees(int exifOrientation) {
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; }
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; }
return 0;
}
Problem
I have been struggling with this bug on and off for the last month or so. Everytime that I think I have fixed it it seems to come back in some form. It is the old Android "Image Rotated 90 degrees" bug. I have read countless Posts on here (StackOverFlow) aswell as tried numerous methods but just cannot seem to fix it. I am still getting images that are rotated incorrectly. In my application a user chooses his/her profile Picture, which is then set to an ImageView. The image is chosen from the Phones Gallery Two days ago I implemented the Following Code, this worked for all the images I tested it with on my Phone. However when one of my Beta testers tried it, his images were once again rotated. He sent me the images for testing but they were displaying fine on my Phone. Hence why I am getting more and more frustrated. This is the method I am using to get the Images orientation: ``` // Gets an Images Orientation public static int getOrientationEXIF(Context context, Uri uri) { int orientation = 0; try { ExifInterface exif = new ExifInterface(uri.getPath()); orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: orientation = 90; return orientation; case ExifInterface.ORIENTATION_ROTATE_180: orientation = 180; return orientation; } } catch (IOException e) { e.printStackTrace(); } return 0; } ``` I then get a rotated Bitmap using this Method: ``` // Rotate a Bitmap public static Bitmap rotate(float rotationValue, String filePath) { Bitmap original= BitmapFactory.decodeFile(filePath); int width = original.getWidth(); int height = original.getHeight(); Matrix matrix = new Matrix(); matrix.postRotate(rotationValue); Bitmap rotated = Bitmap.createBitmap(original, 0, 0, width, height, matrix, true); return rotated; } ``` I am just not sure what to do anymore. I would really like it if someone could help me figure this out Thank you in advance UPDATE I just saw the following line of Code in my Log after implementing the suggested Methods: ``` JHEAD can't open 'file:/external/images/media/3885' ``` I am not sure what this means UPDATE #2 I think I may have fixed the problem, I got the proper image path for the file.