我的画廊中有照片,无论是风景还是肖像。在Gallery应用程序中正确显示。当我使用意图从库中选择图片时,我得到了一个URI。但在我显示图片之前,如何知道图片是纵向还是横向?
我的应用程序使用这样的Intent选择图片:
private OnClickListener btnChooseFromLibraryListener = new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, REQ_CODE_PICK_IMAGE);
}
};
以下是我如何获得意图:
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
switch(requestCode) {
case REQ_CODE_PICK_IMAGE:
if(resultCode == RESULT_OK){
Uri selectedImage = imageReturnedIntent.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();
SetPicture(filePath);
}
}
}
private void SetPicture(String filePath) {
Bitmap bm = BitmapFactory.decodeFile(filePath);
Log.d("TW", "Picture Path:" + filePath);
String size = String.format("Width:%d Height:%d", bm.getWidth(), bm.getHeight());
Log.d("TW", size);
ivPicture.setImageBitmap(bm);
ui.setLastPicture(filePath);
}
答案 0 :(得分:5)
在onActivityResult()
Uri selectedImage = imageReturnedIntent.getData();
String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION};
Cursor cur = managedQuery(selectedImage, orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
使用Matrix对象旋转图像
Matrix matrix = new Matrix();
matrix.postRotate(orientation);
答案 1 :(得分:3)
内容提供商使用了MediaStore.Images.Media.ORIENTATION
字段。
需要稍微修改代码,方法是通过包含字段来告诉您图像所在的orientation,以度,0度,90度,180度,270度表示。
String[] filePathColumn = {
MediaStore.Images.Media.DATA,
MediaStore.Images.Media.ORIENTATION
};
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn,
null,
null,
null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
int orientationIndex = cursor.getColumnIndex(filePathPathColumn[1]);
String filePath = cursor.getString(columnIndex);
String degreesOrientation = cursor.getString(orientationIndex);
cursor.close();
// Now degreesOrientation will tell you exactly the rotation, as in
int nDegrees = Integer.parse(degreesOrientation);
// Check nDegrees - for example: if (nDegrees == 0 || nDegrees == 180) portrait.
答案 2 :(得分:1)
在上面的“答案”之后,我写了以下方法。希望这会帮助其他人。
private int GetRotateAngle(Uri imageUri) {
String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media.ORIENTATION};
Cursor cursor = getContentResolver().query(imageUri, columns, null, null, null);
if (cursor == null) { return 0; }
cursor.moveToFirst();
int orientationColumnIndex = cursor.getColumnIndex(columns[1]);
int orientation = cursor.getInt(orientationColumnIndex);
cursor.close();
return orientation;
}