如何旋转从相机或图库中拍摄的图像。 [英] How rotate image taken from camera or gallery.?
本文介绍了如何旋转从相机或图库中拍摄的图像。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我从相机捕捉图像并从图库中选择图像。在三星设备中,图像在捕获后旋转。
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)
{
}
}
编辑:
我现在尝试使用相机意图从意图获取路径仍然无效。
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);
}
}
现在怎么了?
有人可以帮忙吗?出了什么问题?谢谢..
Can anyone help please? What's going wrong? Thank you..
推荐答案
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结果方法中并获取旋转图像的值。 。
And put this code in Activity result method and get value to rotate image...
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);
}
这篇关于如何旋转从相机或图库中拍摄的图像。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文