Loading smaller images with subsampling
July 19, 2015 5:39 am
In this performance tutorial we use the BitmapFactory.Options inSampleSize for loading smaller images with subsampling therefore saving memory & cpu resources, resulting in more responsiveness especially in scrolling.
Method
Create a scale factor algorithm
private int calculateInSampleSize(BitmapFactory.Options bmOptions) { final int photoWidth = bmOptions.outWidth; final int photoHeight = bmOptions.outHeight; int scaleFactor = 1; if(photoWidth > TARGET_IMAGE_VIEW_WIDTH || photoHeight > TARGET_IMAGE_VIEW_HEIGHT) { final int halfPhotoWidth = photoWidth/2; final int halfPhotoHeight = photoHeight/2; while(halfPhotoWidth/scaleFactor > TARGET_IMAGE_VIEW_WIDTH || halfPhotoHeight/scaleFactor > TARGET_IMAGE_VIEW_HEIGHT) { scaleFactor *= 2; } } return scaleFactor; }
Pass the scale factor to the BitmapFactory.Option inSampleSize
private Bitmap decodeBitmapFromFile(File imageFile) { BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(imageFile.getAbsolutePath(), bmOptions); bmOptions.inSampleSize = calculateInSampleSize(bmOptions); bmOptions.inJustDecodeBounds = false; return BitmapFactory.decodeFile(imageFile.getAbsolutePath(), bmOptions); }
Call the new decode method
@Override protected Bitmap doInBackground(File... params) { // return BitmapFactory.decodeFile(params[0].getAbsolutePath()); mImageFile = params[0]; return decodeBitmapFromFile(params[0]); }
Run the app
Category: Performance, tutorials