Изображение получено или выбрано из повернутого изображения на 90 градусов
Я реализовал функцию захвата / выбора изображения, и он отлично работает в HTC, однако в Samsung Galaxy Note 4 (версия Android 5.1.1) он поворачивает изображение на 90 градусов. Вот 2 варианта кода, но они все еще повернуты:
ВАРИАНТ 1:
public void captureImageCameraOrGallery() {
Intent galleryintent = new Intent(Intent.ACTION_GET_CONTENT, null);
galleryintent.setType("image/*");
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Intent chooser = new Intent(Intent.ACTION_CHOOSER);
chooser.putExtra(Intent.EXTRA_INTENT, galleryintent);
chooser.putExtra(Intent.EXTRA_TITLE, "Select from:");
Intent[] intentArray = { cameraIntent };
chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
startActivityForResult(chooser, REQUEST_PIC);
}
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_PIC && resultCode == RESULT_OK) {
Uri selectedImageUri = data.getData();
Bitmap bmp = null;
try {
if (selectedImageUri != null) {
bmp = getBitmapFromUri(selectedImageUri);
}
if (bmp == null) {
return;
}
ExifInterface ei = new ExifInterface(selectedImageUri.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
Log.e("Capture orientation: ", String.valueOf(orientation));
int rotateAngle = 0;
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotateAngle = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotateAngle = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotateAngle = 270;
break;
default:
break;
}
bmp = rotateImage(bmp, rotateAngle);
mUserImage.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
ВАРИАНТ 2:
Используя компилятор PhotoPicker lib, "me.iwf.photopicker:PhotoPicker:0.9.5@aar"
public void captureImageCameraOrGallery() {
PhotoPicker.builder()
.setPhotoCount(1)
.setShowCamera(true)
.setShowGif(true)
.setPreviewEnabled(false)
.start(this, PhotoPicker.REQUEST_CODE);
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK && requestCode == PhotoPicker.REQUEST_CODE) {
if (data != null) {
ArrayList<String> photos = data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);
Uri selectedImageUri = Uri.fromFile(new File(photos.get(0)));
Bitmap bmp = null;
try {
if (selectedImageUri != null) {
bmp = getBitmapFromUri(selectedImageUri);
}
if (bmp == null) {
return;
}
mUserImage.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Тем не менее, он все еще вращается. Любая помощь будет оценена.
2 ответа
Если в вашем первом варианте вы всегда получаете 0 для ориентации, вы можете попробовать следующее. (Из этого поста)
Попробуйте использовать информацию в курсоре содержимого.
float photoRotation = 0;
boolean hasRotation = false;
String[] projection = { Images.ImageColumns.ORIENTATION };
try {
Cursor cursor = getActivity().getContentResolver().query(photoUri, projection, null, null, null);
if (cursor.moveToFirst()) {
photoRotation = cursor.getInt(0);
hasRotation = true;
}
cursor.close();
} catch (Exception e) {}
if (!hasRotation) {
ExifInterface exif = new ExifInterface(photoUri.getPath());
int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
switch (exifRotation) {
case ExifInterface.ORIENTATION_ROTATE_90: {
photoRotation = 90.0f;
break;
}
case ExifInterface.ORIENTATION_ROTATE_180: {
photoRotation = 180.0f;
break;
}
case ExifInterface.ORIENTATION_ROTATE_270: {
photoRotation = 270.0f;
break;
}
}
}
В некоторых устройствах максимум в samsumg изображение устройства поворачивается на 90 градусов. для этого вам нужно проверить его в exif-файле, какова его точная ориентация, и в соответствии с этим вы должны работать.
int rotateDegree = 0;
try {
File imageFile = new File(sourcepath);
ExifInterface exif = new ExifInterface(
imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotateDegree = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotateDegree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotateDegree = 90;
break;
}
} catch (Exception e) {
e.printStackTrace();
}
Matrix matrix = new Matrix();
matrix.postRotate(rotateDegree );
bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);