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