Android获取相机位图的方向? 并旋转-90度

我有这个代码:

//choosed a picture public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { if (requestCode == ImageHelper.SELECT_PICTURE) { String picture = ""; Uri selectedImageUri = data.getData(); //OI FILE Manager String filemanagerstring = selectedImageUri.getPath(); //MEDIA GALLERY String selectedImagePath = ImageHelper.getPath(mycontext, selectedImageUri); picture=(selectedImagePath!=null)?selectedImagePath:filemanagerstring; 

这只是一个图片select器,从画廊。 这是不错的,但是当我在imageview上打开这张照片时,图像在相机上拍摄时的“人像模式”看起来不错,但是相机拍摄的“风景模式”的图像打开在-90度。

我怎样才能旋转这些图片?

  Bitmap output = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888); Canvas canvas = new Canvas(output); 

我试过这个:

 Log.e("wh", bitmap.getWidth()+" "+bitmap.getHeight()); if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90); 

但这是行不通的,所有的图像尺寸是:* 2560 1920像素(肖像,和风景模式都)

我能做些什么来回转景观照片?

谢谢Leslie

如果使用数码相机或智能手机拍摄照片,旋转通常会存储在照片的Exif数据中,作为图像文件的一部分。 您可以使用Android ExifInterface读取图像的Exif元数据。

首先,创buildExifInterface

 ExifInterface exif = new ExifInterface(uri.getPath()); 

接下来,find当前的旋转:

 int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 

将exif旋转转换为度数:

 int rotationInDegrees = exifToDegrees(rotation); 

哪里

 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; } 

然后使用图像的实际旋转作为参考点,使用Matrix旋转图像。

 Matrix matrix = new Matrix(); if (rotation != 0f) {matrix.preRotate(rotationInDegrees);} 

使用将Matrix作为参数的Bitmap.createBitmap方法创build新的旋转图像:

 Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter) 

Matrix m保持新的旋转:

 Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true); 

请参阅这些教程以获取有用的源代码示例:

  • 在Android中旋转图片 。
  • 阅读JPEG文件中的Exif信息 。

最后的答案在技术上是完美的,但我努力创build一个系统来pipe理图片,旋转,resize,caching和加载到ImageViews,我可以告诉它是一个地狱。 即使全部完成,崩溃有时会在某些设备上导致OutOfMemory。

我的观点是不要重新发明轮子,它有一个完美的devise。 谷歌本身鼓励你使用Glide 。 它工作在一行,超级简单易用,体积轻巧,function数量多, 默认pipe理EXIF ,使用内存就像魅力一样。

我不确定毕加索是否也pipe理EXIF,但是他们都有一个简短的介绍:

https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

我的build议:不要浪费你的时间和使用它们。 你可以在一行中解决你的问题:

 Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);