【发布时间】:2012-01-10 17:39:53
【问题描述】:
我需要拍一张照片,找出它的方向,在画布上绘制它并旋转画布。我需要帮助来确定照片的方向
【问题讨论】:
我需要拍一张照片,找出它的方向,在画布上绘制它并旋转画布。我需要帮助来确定照片的方向
【问题讨论】:
您需要使用照片中嵌入的EXIF标签:
private int getExifOrientation() {
ExifInterface exif;
int orientation = 0;
try {
exif = new ExifInterface( mImagePath );
orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, 1 );
} catch ( IOException e ) {
e.printStackTrace();
}
Log.d(TAG, "got orientation " + orientation);
return orientation;
}
但是,返回的实际 EXIF 值有点奇怪。它允许各种旋转和镜像。我找到的最佳参考是here。通常,在获得方向后,您需要通过查找函数运行它以获取以度数为单位的旋转:
private int getBitmapRotation() {
int rotation = 0;
switch ( getExifOrientation() ) {
case ExifInterface.ORIENTATION_ROTATE_180:
rotation = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_90:
rotation = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotation = 270;
break;
}
return rotation;
}
【讨论】:
我正在寻找类似的解决方案来解决我的问题。我正在从相机或画廊拍摄照片并将其转换为位图以在我的应用程序中使用。问题是在 PORTRAIT 中拍摄的照片被旋转了 -90 度。
搜索答案我发现这篇文章和https://stackoverflow.com/a/11081918/3062284 非常相似。我实际上使用了后一个帖子。但是,就像@StoneHeart 我在读取图像路径时遇到错误。
我在 onActivityResult() 中使用了这段代码:
case CAMERA_REQUEST_CODE:
if (resultCode == RESULT_OK);
uriImage = data.getData();
ExifInterface exif = new ExifInterface(uriImage.getPath());
由于以前的 cmets 没有解决此错误,我想我会分享我使用 https://stackoverflow.com/a/10564727/3062284 找到的解决方案
我需要使用帖子中的这种方法的文件的真实路径。
private String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
CursorLoader loader = new CursorLoader(this, contentUri, proj, null, null, null);
Cursor cursor = loader.loadInBackground();
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
并将我的代码编辑为以下内容:
case CAMERA_REQUEST_CODE:
if (resultCode == RESULT_OK);
uriImage = data.getData();
String imagePath = getRealPathFromURI(uriImage);
ExifInterface exif = new ExifInterface(imagePath);
这解决了我遇到的“JHEAD 无法打开文件”错误。
【讨论】:
你能根据照片的高度和宽度确定方向吗?如果它比它高,它是风景。如果它的高度大于宽度,则为纵向。
如果它是方形的,那么您必须读取 EXIF 数据并希望它是为这些图像设置的。 EXIF 数据应提供方向数据。
【讨论】: