Jun 14, 2011

Reduce Bitmap size using BitmapFactory.Options.inSampleSize

In the post "Load ImageView with JPG file in SD Card", the ImageView is loaded with bitmap in full-size. It cost too much resources for a mobile device, and easy to make the app closed unexpectly.

We can generate a shrinked bitmap using BitmapFactory.Options with inSampleSize; such that to reduce the needed resources greatly.

package com.AndroidLoadImageView;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

public class AndroidLoadImageViewActivity extends Activity {

String imagefile ="/sdcard/IMG_9331.JPG";

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

ImageView image = (ImageView)findViewById(R.id.image);
//Bitmap bm = BitmapFactory.decodeFile(imagefile);
Bitmap bm = ShrinkBitmap(imagefile, 300, 300);
image.setImageBitmap(bm);
}

Bitmap ShrinkBitmap(String file, int width, int height){

BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options();
bmpFactoryOptions.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);

int heightRatio = (int)Math.ceil(bmpFactoryOptions.outHeight/(float)height);
int widthRatio = (int)Math.ceil(bmpFactoryOptions.outWidth/(float)width);

if (heightRatio > 1 || widthRatio > 1)
{
if (heightRatio > widthRatio)
{
bmpFactoryOptions.inSampleSize = heightRatio;
} else {
bmpFactoryOptions.inSampleSize = widthRatio;
}
}

bmpFactoryOptions.inJustDecodeBounds = false;
bitmap = BitmapFactory.decodeFile(file, bmpFactoryOptions);
return bitmap;
}
}



next post:
- Ready image file using build-in Gallery, with Intent.ACTION_PICK

10 comments:

  1. How do I use above for following?

    Bitmap b = BitmapFactory.decodeStream(inputStream);

    ?

    ReplyDelete
  2. Thank you, but this algorithm produces inSampleSize values too small to be useable, my image requires a minimum (and thus ideal) value of 2 and yet it receives a 7 from this, making it insanely small.

    ReplyDelete
  3. Sorry, I meant values too big.

    ReplyDelete
  4. Not working.
    Null pointer Exception at image.setImageBitmap(bm);

    ReplyDelete
  5. How can i save this image again in my path ..by replacing the same one..

    ReplyDelete
  6. This is the code written by Chris Haseman in the book "Creating Android Applications Develop and Design"... You copier

    ReplyDelete
    Replies
    1. Are you talking about this book published at December 25, 2011?

      Please understand that it's a very common approach, you can find many similary code in internet, include Google Developers Website.

      Delete
  7. Thank you for this, I followed your tutorial, works fine, please help me with: http://stackoverflow.com/questions/16954109/reduce-the-size-of-a-bitmap-to-a-specified-size-in-android?noredirect=1#comment24483212_16954109

    ReplyDelete

Infolinks In Text Ads