来自画廊/相机意图的图片方向[重复]
Posted
技术标签:
【中文标题】来自画廊/相机意图的图片方向[重复]【英文标题】:Picture orientation from gallery/camera intent [duplicate] 【发布时间】:2011-05-29 21:25:41 【问题描述】:我正在从相机/图库意图获取图片到我的应用程序。在我从意图/ Uri 读取的许多手机图片中,已经旋转到正确的方向。比如N1,Legend,Desire就是这样。
但是在某些手机(例如 Milestone1、GalaxyS)上,无论以哪种方式拍摄,图片总是更多地是横向的。这意味着在我的应用程序中,肖像图片以错误的方式呈现给用户。我试图读取图片的 EXIF 信息,但方向标签始终为 0。必须有一种方法可以找出图片的正确方向,因为在 Milestone1 中,图库应用程序正确显示了纵向图片。
在向用户展示之前,我如何知道是否需要自己旋转图片?
感谢您的帮助!
【问题讨论】:
你解决了吗?我遇到了完全相同的问题。 不,我从来没有找到解决方案。我最终在 UI 中添加了一个按钮,用于在图像不起作用的情况下手动旋转图像 这是我解决此问题的方法; ***.com/a/8864367/137404 它对我有用.. !已解决的解决方案Solved : How to rotate image to its default orientation selected from gallery in android 【参考方案1】:Florian 答案适用于图库图片。
以下代码适用于捕获的图像,尚未尝试使用图库图像,但我相信它应该可以工作。希望这对任何人都有帮助。
代码:
public static 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.v(TAG, "Exif orientation: " + orientation);
catch (Exception e)
e.printStackTrace();
return rotate;
编辑: 从 cmets 中可以看出,一些设备不支持 Exif 信息,没有检查过,但我认为 HTC 不支持。请务必检查哪些设备并创建替代方案。
【讨论】:
您尝试过哪些设备?我使用了几乎完全相同的代码,但它不适用于所有设备,因为并非所有设备都在返回的图像中包含 EXIF 数据。摩托罗拉和三星设备往往会出现问题。 我在三星 Galaxy S1 上试过,效果很好。 仍然适用于最新的三星设备,尤其是 4.3,该错误仍然存在。似乎已在 4.4 中修复 @eric.itzhak 行“context.getContentResolver().notifyChange(imageUri, null);”的目的是什么? 在 htc one m8 (6.0) 和 Nexus 5x (8.1.1) 上不工作总是返回 1【参考方案2】:以下方法以度为单位返回图像的方向。它适用于画廊中的图像。返回值:
正常风景:0 正常人像:90 倒置横向:180 倒立肖像:270 图片未找到:-1代码:
public static int getOrientation(Context context, Uri photoUri)
Cursor cursor = context.getContentResolver().query(photoUri,
new String[] MediaStore.Images.ImageColumns.ORIENTATION ,
null, null, null);
try
if (cursor.moveToFirst())
return cursor.getInt(0);
else
return -1;
finally
cursor.close();
【讨论】:
我怎样才能让它适用于刚刚捕获的图像? 对不起,不知道。找到解决办法可以分享一下吗? 不适用于图库图片中的 uri。无论如何它都会返回 0【参考方案3】: int rotate = 0;
try
File imageFile = new File(sourcepath);
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;
catch (Exception e)
e.printStackTrace();
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
【讨论】:
这里的位图是什么,你传入Bitmap.createBitmap?我只有源图像 Uri,而不是位图。【参考方案4】:这是我找到的最佳答案,作者是 ramaral。 https://***.com/a/20480741/2258389 非常适合画廊或相机
【讨论】:
这应该是一条评论 如果我有名声就好了【参考方案5】:您必须首先使用 contentresolver 创建图库对象,然后将创建的 uri 传递给图像捕获意图。然后您可以查看 exif 数据,而不是画廊方向数据。
【讨论】:
非常感谢您的回复。如果这能尽快解决我们的问题,我会尝试。 对,事实证明我真的不明白您使用内容解析器创建画廊对象的意思。您能否指出您所指的对象类型的 API 的正确位置或描述该过程的示例代码。谢谢! 四处搜索后,我在这里找到了一个如何执行此操作的示例:geek.gankahhwee.com/2010/11/19/…。不幸的是,在使用 getContentResolver() 编写了一些代码来创建我的 Uri 之后,我仍然遇到 EXIF 方向始终为“0”的相同问题。【参考方案6】:Matrix matrix = new Matrix();
ExifInterface exifReader = new ExifInterface(filePath);
int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
if (orientation ==ExifInterface.ORIENTATION_NORMAL)
// Do nothing. The original image is fine.
else if (orientation == ExifInterface.ORIENTATION_ROTATE_90)
matrix.postRotate(90);
else if (orientation == ExifInterface.ORIENTATION_ROTATE_180)
matrix.postRotate(180);
else if (orientation == ExifInterface.ORIENTATION_ROTATE_270)
matrix.postRotate(270);
【讨论】:
请编辑您的答案并格式化代码以使其可读 这个问题的重点是exif信息不存在。使用 exif 数据没有问题。【参考方案7】:我对 S1 也有同样的问题,我注意到即使您使用图库应用打开图像,它也会以横向模式打开(手机不知道照片的正确方向)。 如果您在相机应用中将手机旋转为纵向,则图标(拍照、对焦和设置)不会旋转,请尝试在 S2 或任何支持横向/人像相机的设备中旋转这些图标。
我确定股票相机应用程序不支持按比例模式拍照。
【讨论】:
【参考方案8】:我已经为一个项目这样做了,因为我遇到了同样的问题(Android 认为你只会在横向上做一张图片)。我当时所做的是检测手机方向,然后旋转图像。但是,它假设接收到意图时方向仍然相同。
【讨论】:
这个解决方案对我们来说并不是一个真正的选择:(我们需要让我们的应用程序每次都能正常工作,否则质量将无法接受。画廊应用程序可以处理必须有更好的方法两部手机的方向都正确。【参考方案9】:这看起来与此问题中解决的问题相同: Android: Bitmaps loaded from gallery are rotated in ImageView
【讨论】:
【参考方案10】:这样用吧!
private static int exifToDegrees(int exifOrientation)
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90)
return 90;
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180)
return 180;
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270)
return 270;
return 0;
在代码中,
Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true);
简单!
【讨论】:
这里的actualImage
是什么?我只有源图像 Uri,而不是位图【参考方案11】:
我在做什么: 首先使用相机的元数据信息检查相机拍摄的图像的方向,如果我们在纵向中找到它,则必须将图像旋转 90 度并显示,否则仅显示。
为了获取有关图像方向的信息,我们可以使用 Exif 接口。 就是这样!
【讨论】:
【参考方案12】:简单的 exiftodegree 答案只有在您拍照并且我使用它时才能始终如一地工作。对于那些在选择照片和获取正确方向时遇到问题的人,请在此处查看我的回答:Image Orientation - Android
【讨论】:
以上是关于来自画廊/相机意图的图片方向[重复]的主要内容,如果未能解决你的问题,请参考以下文章