Some times we need to reduce the size of images retrieved from camera down to a few smaller sizes or situations like OutOfMemoryError due to bitmap size , images that showing in a list view or grid view etc. Then we resize the picture for reducing the memory usage . Here is an simple example for doing this.
/**
* This function is used to read the original image file from a given path
* and then scale it and save it to the application's private scope.
*
* @param sourceImageFilePath Complete path name for the file to be opened.
* @param desiredWidth The desired image width for this image.
* @param context To identify the context's application package for writing a private image file.
* @param destinationImageName The file name of the image to be saved within the applications private scope.
* @return The scaled bitmap image after saved to the destination file.
*/
public static Bitmap saveGalleryImageBitmap(String sourceImageFilePath, int desiredWidth, Context context, String destinationImageName, int rotate) {
Bitmap scaledBitmap = null;
Bitmap rotatedBitmap = null;
try {
// Get the source image's dimensions
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(sourceImageFilePath, options);
int srcWidth = options.outWidth;
// Only scale if the source is big enough. This code is just trying to fit a image into a certain width.
if (desiredWidth > srcWidth)
desiredWidth = srcWidth;
// Calculate the correct inSampleSize/scale value. This helps reduce
// memory use. It should be a power of 2
// from:
// http://stackoverflow.com/questions/477572/android-strange-out-of-memory-issue/823966#823966
int inSampleSize = 1;
while (srcWidth / 2 > desiredWidth) {
srcWidth /= 2;
inSampleSize *= 2;
}
float desiredScale = (float) desiredWidth / srcWidth;
// Decode with inSampleSize
options.inJustDecodeBounds = false;
options.inDither = false;
options.inSampleSize = inSampleSize;
options.inScaled = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(sourceImageFilePath, options);
// Resize
Matrix matrix = new Matrix();
matrix.postScale(desiredScale, desiredScale);
scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);
sampledSrcBitmap = null;
// Save
FileOutputStream out = null;
try {
out = context.openFileOutput(destinationImageName, Context.MODE_PRIVATE);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Matrix rotateMatrix = new Matrix();
rotateMatrix.postRotate(rotate); // For rotating the image.
rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, scaledBitmap.getWidth(), scaledBitmap.getHeight(), rotateMatrix, true);
scaledBitmap = null;
rotatedBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
} catch (OutOfMemoryError e) {
scaledBitmap = null;
e.printStackTrace();
} catch (Exception e) {
scaledBitmap = null;
e.printStackTrace();
}
return rotatedBitmap;
}
No comments:
Post a Comment