我有这段代码:
//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;
...
这只是一个图片选择器,来自画廊。这很不错,但是当我在一个imageview上打开这张照片时,带有相机的“PORTRAIT MODE”的图像看起来不错,但带有相机的“LANDSCAPE MODE”的图像在-90度开启。
如何将这些照片旋转回来?
Bitmap output = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
我试过这个:
Log.e("w h", bitmap.getWidth()+" "+bitmap.getHeight());
if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90);
但这不起作用,所有图像尺寸均为:* 2560 1920像素(PORTRAIT和LANDSCAPE模式全部)
如何旋转LANDSCAPE图片?
感谢Leslie
答案 0 :(得分:208)
如果使用数码相机或智能手机拍摄照片,则旋转通常会存储在照片的Exif数据中,作为图像文件的一部分。您可以使用Android ExifInterface
阅读图片的Exif元数据。
首先,创建ExifInterface
:
ExifInterface exif = new ExifInterface(uri.getPath());
接下来,找到当前的轮换:
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 != 0) {matrix.preRotate(rotationInDegrees);}
使用Bitmap.createBitmap
方法创建新的旋转图像,该方法将Matrix
作为参数:
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);
有关有用的源代码示例,请参阅本教程:
答案 1 :(得分:0)
最后的答案在技术上是完美的,但我努力创建一个系统来管理图片,旋转,调整大小,缓存和加载到ImageViews,我可以说它是一个地狱。即使完成所有操作,崩溃有时也会导致某些设备出现OutOfMemory。
我的观点是不要重新发明轮子,它有一个完美的设计。 Google本身鼓励您使用Glide。它工作在一行,超级易用,重量轻,功能数量,默认管理EXIF ,它使用内存像魅力..它只是黑魔术编码;)
我不确定Picasso是否也管理EXIF,但有两个快速介绍:
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
我的建议:不要浪费你的时间并使用它们。您可以在一行中解决您的问题:
Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
答案 2 :(得分:0)
如果您使用的是Jetpack CameraX
,则可以在onImageCaptured
方法内访问EXIF
的{{1}}数据提供的旋转度,如下所示:
imageProxy
然后在设置图像时,您可以按照此角度旋转图像