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