Java tutorial
//package com.java2s; // Licensed under the MIT license. import android.content.ContentResolver; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.graphics.Rect; import android.media.ExifInterface; import android.net.Uri; import android.provider.MediaStore; import java.io.IOException; import java.io.InputStream; public class Main { private static final int IMAGE_MAX_SIDE_LENGTH = 1280; public static Bitmap loadSizeLimitedBitmapFromUri(Uri imageUri, ContentResolver contentResolver) { try { // Load the image into InputStream. InputStream imageInputStream = contentResolver.openInputStream(imageUri); // For saving memory, only decode the image meta and get the side length. BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; Rect outPadding = new Rect(); BitmapFactory.decodeStream(imageInputStream, outPadding, options); // Calculate shrink rate when loading the image into memory. int maxSideLength = options.outWidth > options.outHeight ? options.outWidth : options.outHeight; options.inSampleSize = 1; options.inSampleSize = calculateSampleSize(maxSideLength, IMAGE_MAX_SIDE_LENGTH); options.inJustDecodeBounds = false; imageInputStream.close(); // Load the bitmap and resize it to the expected size length imageInputStream = contentResolver.openInputStream(imageUri); Bitmap bitmap = BitmapFactory.decodeStream(imageInputStream, outPadding, options); maxSideLength = bitmap.getWidth() > bitmap.getHeight() ? bitmap.getWidth() : bitmap.getHeight(); double ratio = IMAGE_MAX_SIDE_LENGTH / (double) maxSideLength; if (ratio < 1) { bitmap = Bitmap.createScaledBitmap(bitmap, (int) (bitmap.getWidth() * ratio), (int) (bitmap.getHeight() * ratio), false); } return rotateBitmap(bitmap, getImageRotationAngle(imageUri, contentResolver)); } catch (Exception e) { return null; } } private static int calculateSampleSize(int maxSideLength, int expectedMaxImageSideLength) { int inSampleSize = 1; while (maxSideLength > 2 * expectedMaxImageSideLength) { maxSideLength /= 2; inSampleSize *= 2; } return inSampleSize; } private static Bitmap rotateBitmap(Bitmap bitmap, int angle) { // If the rotate angle is 0, then return the original image, else return the rotated image if (angle != 0) { Matrix matrix = new Matrix(); matrix.postRotate(angle); return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } else { return bitmap; } } private static int getImageRotationAngle(Uri imageUri, ContentResolver contentResolver) throws IOException { int angle = 0; Cursor cursor = contentResolver.query(imageUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor != null) { if (cursor.getCount() == 1) { cursor.moveToFirst(); angle = cursor.getInt(0); } cursor.close(); } else { ExifInterface exif = new ExifInterface(imageUri.getPath()); int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: angle = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: angle = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: angle = 90; break; default: break; } } return angle; } }