相机文件夹图像显示为旋转

时间:2015-01-03 12:50:56

标签: android android-gallery

我正在尝试在我的应用中处理图片。我目前面临的问题与图像的方向有关。从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。无法得到我在这里做错的事。

2 个答案:

答案 0 :(得分:1)

得到了解决方案。我使用了来自BitmapUtilgetThumbnail(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上找到了这个解决方案,提供了一个超级简单的解决方法。

Link