我正在尝试在我的应用中处理图片。我目前面临的问题与图像的方向有关。从Android相机文件夹中选择的图像缩略图显示旋转90度。我得到的缩略图如下;
Uri thumbUri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, uri.getLastPathSegment());
if (thumbUri != null){
try {
List<String> parts = uri.getPathSegments();
String lastPart = parts.get(parts.size() - 1);
int index = lastPart.indexOf(":");
if (index != -1)
{
lastPart = lastPart.substring(index+1);
}
long id = Long.parseLong(lastPart);
// get a thumbnail for the image
Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail(
context.getContentResolver(),
id,
MediaStore.Images.Thumbnails.MINI_KIND,
null
);
if (bitmap != null)
{
return bitmap;
}
}
catch (Exception e)
{
Log.e(LOG_TAG, "Unable to generate thumbnail from thumbnail uri " + e.getMessage(), e);
}
}
还尝试通过从ExifInterface
as;
ExifInterface ei = new ExifInterface(uri.getPath());
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
但返回的orientation
始终为0 ORIENTATION_UNDEFINED
。无法得到我在这里做错的事。
答案 0 :(得分:1)
得到了解决方案。我使用了来自BitmapUtil
的getThumbnail(ContentResolver contentResolver, long id)
方法,该方法从游标中读取图像的元数据,然后进行相应的处理。
感谢Jason Fry
这个有用的实用程序。
答案 1 :(得分:0)
您可以使用Matrix对位图执行额外的旋转来执行简单的解决方法。这很简单。
//we don't need a NullPointerException now, do we?
if (bitmap != null)
{
//ever so simply initialize a Matrix
Matrix matrix = new Matrix();
//tell the Matrix it should rotate everything it's applied to by -90 degreeds
matrix.postRotate(-90);
//create a clone of the bitmap while applying the mentioned Matrix
//for width and height attributes, you must always use old bitmap's width and height
bitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(),
matrix, true);
return bitmap;
}
编辑:
如果您需要确定拍摄的照片的方向(横向/纵向),然后确定要旋转哪些方向,则可以使用来自this question/answer的代码和ExifInterface。 我看到你已经应用了类似的东西,所以也许你应该只用一个参数来尝试这个修改,就像链接的答案一样:
exif.getAttribute(ExifInterface.TAG_ORIENTATION);
更新:
好的,所以它也不起作用。但它应该,对吧?这就是所提到的方法所做的。因此,我建议您查看uri.getPath()
实际返回的内容(使用调试器或System.out.println()
),看看它是否正确。无效的路径错误发生在我身上很多次,并且每次花费一段时间才能找出错误。
String path = uri.getPath();
//breakpoint somewhere below
更新2:
我做了一些研究,显然,你无法从URI获得绝对文件路径。所以我在StackOverflow.com上找到了这个解决方案,提供了一个超级简单的解决方法。