Android从图库中获取图像旋转

我正在尝试让用户从图库中select一个资料图片。 我的问题是,有些图片旋转到右侧。

我开始像这样的图像select器:

Intent photoPickerIntent = new Intent(); photoPickerIntent.setType("image/*"); photoPickerIntent.setAction(Intent.ACTION_GET_CONTENT); startActivityForResult(Intent.createChooser(photoPickerIntent, "Select profile picture"), Global.CODE_SELECT_PICTURE); 

我从onActivityResult中获取图像,如下所示:

 Uri selectedPicture = data.getData(); profilePic = MediaStore.Images.Media.getBitmap(activity.getContentResolver(), selectedPicture); 

我如何让图像不能旋转?

更新:

在收到一些有用的答案后,我设法提出了以下工作解决scheme(这只是一个工作代码,写得不好)。 我很想得到你的反馈,我可以改善它!

 public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == Activity.RESULT_OK && requestCode == Global.CODE_SELECT_PICTURE) { // Get selected gallery image Uri selectedPicture = data.getData(); // Get and resize profile image String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = activity.getContentResolver().query(selectedPicture, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); Bitmap loadedBitmap = BitmapFactory.decodeFile(picturePath); ExifInterface exif = null; try { File pictureFile = new File(picturePath); exif = new ExifInterface(pictureFile.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } int orientation = ExifInterface.ORIENTATION_NORMAL; if (exif != null) orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: loadedBitmap = rotateBitmap(loadedBitmap, 90); break; case ExifInterface.ORIENTATION_ROTATE_180: loadedBitmap = rotateBitmap(loadedBitmap, 180); break; case ExifInterface.ORIENTATION_ROTATE_270: loadedBitmap = rotateBitmap(loadedBitmap, 270); break; } } } public static Bitmap rotateBitmap(Bitmap bitmap, int degrees) { Matrix matrix = new Matrix(); matrix.postRotate(degrees); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } 

Solutions Collecting From Web of "Android从图库中获取图像旋转"

您可以使用ExifInterface来修改方向:

 public static Bitmap modifyOrientation(Bitmap bitmap, String image_absolute_path) throws IOException { ExifInterface ei = new ExifInterface(image_absolute_path); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: return rotate(bitmap, 90); case ExifInterface.ORIENTATION_ROTATE_180: return rotate(bitmap, 180); case ExifInterface.ORIENTATION_ROTATE_270: return rotate(bitmap, 270); case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: return flip(bitmap, true, false); case ExifInterface.ORIENTATION_FLIP_VERTICAL: return flip(bitmap, false, true); default: return bitmap; } } public static Bitmap rotate(Bitmap bitmap, float degrees) { Matrix matrix = new Matrix(); matrix.postRotate(degrees); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } public static Bitmap flip(Bitmap bitmap, boolean horizontal, boolean vertical) { Matrix matrix = new Matrix(); matrix.preScale(horizontal ? -1 : 1, vertical ? -1 : 1); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } 

为了从他们的uri获得你的图像的绝对path,请检查这个答案

我这样做:

 public void browseClick(View view) { view.startAnimation(AnimationUtils.loadAnimation(getApplicationContext(), R.anim.button_animation)); Intent i = new Intent( Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, RESULT_LOAD_IMAGE); } 

而方向检查的结果最令你感兴趣的是:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaStore.Images.Media.DATA }; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); String picturePath = cursor.getString(columnIndex); cursor.close(); Bitmap loadedBitmap = BitmapFactory.decodeFile(picturePath); Matrix matrix = new Matrix(); Bitmap scaledBitmap; if (loadedBitmap.getWidth() >= loadedBitmap.getHeight()){ matrix.setRectToRect(new RectF(0, 0, loadedBitmap.getWidth(), loadedBitmap.getHeight()), new RectF(0, 0, 400, 300), Matrix.ScaleToFit.CENTER); scaledBitmap = Bitmap.createBitmap(loadedBitmap, 0, 0, loadedBitmap.getWidth(), loadedBitmap.getHeight(), matrix, true); } else{ matrix.setRectToRect(new RectF(0, 0, loadedBitmap.getWidth(), loadedBitmap.getHeight()), new RectF(0, 0, 300, 400), Matrix.ScaleToFit.CENTER); scaledBitmap = Bitmap.createBitmap(loadedBitmap, 0, 0, loadedBitmap.getWidth(), loadedBitmap.getHeight(), matrix, true); } File file = new File(getExternalCacheDir(), "image.jpg"); try { FileOutputStream out = new FileOutputStream(file); scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); out.flush(); out.close(); } catch (Exception e) { Log.e("Image", "Convert"); } imageView.setImageBitmap(scaledBitmap); } } 

我使用这些静态方法。 第一个确定方向,第二个旋转图像根据需要缩小。

 public static int getOrientation(Context context, Uri photoUri) { Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor == null || cursor.getCount() != 1) { return 90; //Assuming it was taken portrait } cursor.moveToFirst(); return cursor.getInt(0); } /** * Rotates and shrinks as needed */ public static Bitmap getCorrectlyOrientedImage(Context context, Uri photoUri, int maxWidth) throws IOException { InputStream is = context.getContentResolver().openInputStream(photoUri); BitmapFactory.Options dbo = new BitmapFactory.Options(); dbo.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, dbo); is.close(); int rotatedWidth, rotatedHeight; int orientation = getOrientation(context, photoUri); if (orientation == 90 || orientation == 270) { Log.d("ImageUtil", "Will be rotated"); rotatedWidth = dbo.outHeight; rotatedHeight = dbo.outWidth; } else { rotatedWidth = dbo.outWidth; rotatedHeight = dbo.outHeight; } Bitmap srcBitmap; is = context.getContentResolver().openInputStream(photoUri); Log.d("ImageUtil", String.format("rotatedWidth=%s, rotatedHeight=%s, maxWidth=%s", rotatedWidth, rotatedHeight, maxWidth)); if (rotatedWidth > maxWidth || rotatedHeight > maxWidth) { float widthRatio = ((float) rotatedWidth) / ((float) maxWidth); float heightRatio = ((float) rotatedHeight) / ((float) maxWidth); float maxRatio = Math.max(widthRatio, heightRatio); Log.d("ImageUtil", String.format("Shrinking. maxRatio=%s", maxRatio)); // Create the bitmap from file BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = (int) maxRatio; srcBitmap = BitmapFactory.decodeStream(is, null, options); } else { Log.d("ImageUtil", String.format("No need for Shrinking. maxRatio=%s", 1)); srcBitmap = BitmapFactory.decodeStream(is); Log.d("ImageUtil", String.format("Decoded bitmap successful")); } is.close(); /* * if the orientation is not 0 (or -1, which means we don't know), we * have to do a rotation. */ if (orientation > 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); srcBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(), srcBitmap.getHeight(), matrix, true); } return srcBitmap; } 

2使用毕加索和滑行库的一线解决scheme

花费了大量的时间和大量的图像旋转问题的解决scheme后,我终于find了两个简单的解决scheme。 我们不需要做任何额外的工作。

使用毕加索图书馆 https://github.com/square/picasso

 Picasso.with(context).load("http url or sdcard url").into(imageView); 

使用滑行库 https://github.com/bumptech/glide

 Glide.with(this).load("http url or sdcard url").into(imgageView); 

毕加索和滑翔是一个非常强大的图书馆处理您的应用程序包括图像。 它将读取图像EXIF数据并自动旋转图像。