I'm working on a Android-Project, in which the User can upload a Image as Profile image. It all worked fine until some point (eventually a Samsung-Update). Since then, the Images on Samsung Galaxy devices (maybe also on others), but on my HTC One XL it works fine, on my Lenovo Yoga Tablet also and on a Sony (don't know exactly which) also. But on the Galaxy's S6 and S5 it rotates the Image. The Idea is, that an Image is set in the "normal" perspective as an User took it. It means, It should take just a square, but of course, that the had is upright. With the Samsung-Devices the Head is 90 degree wrong anticlockwise. The Code works perfectly on other Devices. Has someone the same Problem? Any Idea? Here is some Code
// After image taken
public void onActivityResult(int requestCode, int resultCode, Intent data) {
try {
// data returned
if (resultCode != FragmentActivity.RESULT_CANCELED) {
if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK){
// Set profile image from gallery
try {
Uri selectedImage = data.getData();
photo = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImage);
photo = MainUtils.rotateBitmap(photo, data, getActivity());
photo = MainUtils.resizeBitmapIfNeeded(photo, 800, 800);
byte[] byteArray;
ByteArrayOutputStream stream = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 90, stream);
byteArray = stream.toByteArray();
// Save image to parse as ParseFile and connect to the ParseUser (redacted)
}
MainUtils Methods:
public static Bitmap resizeBitmapIfNeeded(Bitmap image, int maxWidth, int maxHeight) {
if (maxHeight > 0 && maxWidth > 0) {
int wid = image.getWidth();
int hei = image.getHeight();
MainUtils.log(" resizeBitmapIfNeeded, size is " + wid + " X " + hei);
if (wid > maxWidth || hei > maxHeight) {
int width = image.getWidth();
int height = image.getHeight();
float ratioBitmap = (float) width / (float) height;
float ratioMax = (float) maxWidth / (float) maxHeight;
int finalWidth = maxWidth;
int finalHeight = maxHeight;
if (ratioMax > 1) {
finalWidth = (int) ((float) maxHeight * ratioBitmap);
} else {
finalHeight = (int) ((float) maxWidth / ratioBitmap);
}
image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);
wid = image.getWidth();
hei = image.getHeight();
MainUtils.log(" resizeBitmapIfNeeded, resized size is " + wid + " X " + hei);
return image;
} else {
return image;
}
} else {
return image;
}
}
public static Bitmap rotateBitmap(Bitmap bitmap, Intent data, Context context) {
int orientation = 0;
try {
Uri selectedImage = data.getData();
ExifInterface exif;
exif = new ExifInterface(MainUtils.getRealPathFromUri(context, selectedImage));
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
MainUtils.log("Orientation is " + orientation);
} catch (IOException excep) {
MainUtils.log("Rotate " + excep.getMessage());
}
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
matrix.setScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_FLIP_VERTICAL:
matrix.postRotate(180);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_TRANSPOSE:
matrix.postRotate(90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_TRANSVERSE:
matrix.postRotate(-90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
public static Bitmap rotateBitmapFromFile(String picturePath) {
int orientation = 0;
Bitmap bitmap = BitmapFactory.decodeFile(picturePath);
try {
ExifInterface exif = new ExifInterface(picturePath);
orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
MainUtils.log("Orientation is " + orientation);
} catch (IOException excep) {
MainUtils.log("Rotate " + excep.getMessage());
}
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
matrix.setScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.postRotate(180);
break;
case ExifInterface.ORIENTATION_FLIP_VERTICAL:
matrix.postRotate(180);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_TRANSPOSE:
matrix.postRotate(90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.postRotate(90);
break;
case ExifInterface.ORIENTATION_TRANSVERSE:
matrix.postRotate(-90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.postRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
e.printStackTrace();
return null;
}
}
Gallery Intent
Intent intent = new Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(
Intent.createChooser(intent, "Select File"),
galleryRequest);
Duplicate Question, see Android image selected from gallery Orientation is always 0 : Exif TAG
Check answer of MKJParekh. What you have to do: 1.) Retrieve orientation of the bitmap media store 2.) Rotate the bitmap according the orientation if necessary