Pages

Subscribe:

Ads 468x60px

This blog is not for business or commercial purpose. Its my personal blog and if you people like to read the blog Enjoy and Gain the knowledge

Monday, September 24, 2012

Reduce Bitmap size using BitmapFactory.Options.inSampleSize


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.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<ImageView 
 android:id="@+id/image"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    />
</LinearLayout>

android.graphics.BitmapFactory class provide a method decodeFile(String pathName) to decode a file path into a bitmap. The decoded bitmap can be loaded to ImageView using setImageBitmap() method of the ImageView.

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_1.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);
        image.setImageBitmap(bm);
    }
}

We can generate a shrinked bitmap using BitmapFactory.Optionswith 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_1.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;
    }
}

1 comments :

  1. Thank you very much, this saved me in a very simple way.

    ReplyDelete

Please post comments here:-)