![](/img/trans.png)
[英]How to Get Image URI from Image selected From gallery. Android 5.0.2?
[英]How rotate image taken from camera or gallery.?
我正在從相機捕獲圖像並從圖庫中選擇圖像。 在三星設備中,圖像在捕獲后會旋轉。
如果要旋轉圖像,我希望將圖像旋轉為直線。
我嘗試這樣做,但無法正常工作。
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)
{
}
}
編輯:
我現在嘗試使用相機意圖,並從意圖獲取路徑仍然無法正常工作。
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);
}
}
現在怎么了
有人可以幫忙嗎? 怎么了 謝謝..
profileImage = destination;
您將縮略圖作為位圖,並將其寫入文件。
然后,使用該文件提取exifinterface。
但是位圖不包含exif信息。 因此,您的文件也不會。
因此,您的方向始終為空;
如果您曾使用profileImage
啟動相機意圖,則將其保持原樣。
因此,刪除上述聲明。
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.