I am capturing image from camera and selecting image from gallery. In samsung devices the images gets rotate after captured.
I want rotate image to straight if they are rotated.
I tried to do it but its not working.
private void onCaptureImageResult(Intent data) {
try {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.PNG, 100, bytes);
File destination = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".png");
FileOutputStream fo;
destination.createNewFile();
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.close();
profileImage = destination;
Bitmap rotatedBitmap = modifyOrientation(thumbnail, profileImage.getAbsolutePath());
ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
byte[] byteArray1 = stream1.toByteArray();
File tempFile1 = File.createTempFile("temp", null, getCacheDir());
FileOutputStream fos1 = new FileOutputStream(tempFile1);
fos1.write(byteArray1);
if (rotatedBitmap != null) {
profileImageView.setImageBitmap(rotatedBitmap);
profileImage = tempFile1;
} else {
profileImageView.setImageBitmap(thumbnail);
profileImage = destination;
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
@SuppressWarnings("deprecation")
private void onSelectFromGalleryResult(Intent data) {
Bitmap bm=null;
if (data != null) {
try {
bm = MediaStore.Images.Media.getBitmap(getApplicationContext().getContentResolver(), data.getData());
} catch (IOException e) {
e.printStackTrace();
}
}
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, stream); //replace 100 with desired quality percentage.
byte[] byteArray = stream.toByteArray();
try {
File tempFile = File.createTempFile("temp",null, getCacheDir());
FileOutputStream fos = new FileOutputStream(tempFile);
fos.write(byteArray);
profileImage = tempFile;
Bitmap rotatedBitmap = modifyOrientation(bm,profileImage.getAbsolutePath());
ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
byte[] byteArray1 = stream1.toByteArray();
File tempFile1 = File.createTempFile("temp",null, getCacheDir());
FileOutputStream fos1 = new FileOutputStream(tempFile1);
fos1.write(byteArray1);
if(rotatedBitmap != null) {
profileImageView.setImageBitmap(rotatedBitmap);
profileImage = tempFile1;
}
else {
profileImageView.setImageBitmap(bm);
profileImage = tempFile;
}
}
catch (IOException e)
{
}
}
EDIT:
I tried to use camera intent now and get path from intent still its not working.
private void onCaptureImageResult(Intent data) {
try {
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.PNG, 100, bytes);
File destination = new File(Environment.getExternalStorageDirectory(),
System.currentTimeMillis() + ".png");
FileOutputStream fo;
destination.createNewFile();
fo = new FileOutputStream(destination);
fo.write(bytes.toByteArray());
fo.close();
Bitmap rotatedBitmap = null;
// profileImage = destination;
Uri tempUri = getImageUri(getApplicationContext(),thumbnail);
// CALL THIS METHOD TO GET THE ACTUAL PATH
File finalFile = new File(getRealPathFromURI(tempUri));
ExifInterface ei = new ExifInterface(finalFile.getAbsolutePath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_UNDEFINED);
switch(orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotateImage(thumbnail, 90);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotateImage(thumbnail, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotateImage(thumbnail, 270);
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
break;
}
if (rotatedBitmap != null) {
profileImageView.setImageBitmap(rotatedBitmap);
ByteArrayOutputStream stream1 = new ByteArrayOutputStream();
rotatedBitmap.compress(Bitmap.CompressFormat.PNG, 100, stream1); //replace 100 with desired quality percentage.
byte[] byteArray1 = stream1.toByteArray();
File tempFile1 = File.createTempFile("temp", null, getCacheDir());
FileOutputStream fos1 = new FileOutputStream(tempFile1);
fos1.write(byteArray1);
profileImage = tempFile1;
} else {
profileImageView.setImageBitmap(thumbnail);
profileImage = destination;
}
}
catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public Uri getImageUri(Context inContext, Bitmap inImage) {
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
inImage.compress(Bitmap.CompressFormat.PNG, 100, bytes);
String path = MediaStore.Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
return Uri.parse(path);
}
public String getRealPathFromURI(Uri uri) {
Cursor cursor = getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
return cursor.getString(idx);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
if (requestCode == SELECT_FILE)
onSelectFromGalleryResult(data);
else if (requestCode == REQUEST_CAMERA)
onCaptureImageResult(data);
}
}
What's wrong now?
Can anyone help please? What's going wrong? Thank you..
答案 0 :(得分:0)
profileImage = destination;
您获取了位图缩略图并将其写入文件。
之后,您使用该文件提取exifinterface。
但位图不包含exif信息。因此你的文件也没有。
因此,您的方向始终为空;
如果您使用profileImage
启动相机意图,请保持原样。
请删除上述声明。
答案 1 :(得分:0)
public int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){
int rotate = 0;
try {
context.getContentResolver().notifyChange(imageUri, null);
File imageFile = new File(imagePath);
ExifInterface exif = new ExifInterface(imageFile.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_270:
rotate = 270;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotate = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotate = 90;
break;
}
Log.i("RotateImage", "Exif orientation: " + orientation);
Log.i("RotateImage", "Rotate value: " + rotate);
} catch (Exception e) {
e.printStackTrace();
}
return rotate;
}
并将此代码放在Activity结果方法中并获取旋转图像的值...
String selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
filePath = cursor.getString(columnIndex);
cursor.close();
int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath);
使用此
旋转位图 public static Bitmap rotate(Bitmap bitmap, float degrees) {
Matrix matrix = new Matrix();
matrix.postRotate(degrees);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}