Android - how to compress or downsize an image?

11,720

Solution 1

You can mess with the ImageButton's scaleType properties (to fitXY for example, or cropCenter), and by setting a fixed size to LayoutPreferences (height and width) you'll be all set.

Solution 2

Bitmap thumb = Bitmap.createScaledBitmap (BitmapFactory.decodeFile(photoPath), 96, 96, false);

Where the second and third parameters to createScaledBitmap are the width and height respectively.

http://developer.android.com/reference/android/graphics/Bitmap.html#createScaledBitmap%28android.graphics.Bitmap,%20int,%20int,%20boolean%29

EDIT: It now occurred to me that you can do this in a faster, more efficient way, using BitmapFactory.Options and the inSampleSize option:

BitmapFactory.Options opts = new BitmapFactory.Options ();
opts.inSampleSize = 2;   // for 1/2 the image to be loaded
Bitmap thumb = Bitmap.createScaledBitmap (BitmapFactory.decodeFile(photoPath, opts), 96, 96, false);

This way you will save even more memory and the downsizing should take less time.

Share:
11,720
Beginner
Author by

Beginner

I am a Beginner to everything

Updated on June 04, 2022

Comments

  • Beginner
    Beginner almost 2 years
    ImageButton avatarButton = (ImageButton) findViewById(R.id.ImageButton_Avatar);
    avatarButton.setImageResource(R.drawable.avatar);
    strAvatarFilename =  "Image.jpg"; 
    final Uri imageUriToSaveCameraImageTo = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/Folder/"+strAvatarFilename));
    avatarButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Intent pictureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            pictureIntent.putExtra( MediaStore.EXTRA_OUTPUT, imageUriToSaveCameraImageTo );
            startActivityForResult(Intent.createChooser(pictureIntent, strAvatarPrompt), TAKE_AVATAR_CAMERA_REQUEST);
            Editor editor = Preferences.edit();
            editor.putString(PREFERENCES_AVATAR, imageUriToSaveCameraImageTo.getPath());
            editor.commit();
        }
    });
    

    I have this code. It takes a photo and then stores it in two locations, the default location on the SDcard and the /folder/ file i want the photo to be stored in also. Once taken i refresh the screen using this...

    ImageButton avatarButton = (ImageButton) findViewById(R.id.ImageButton_Avatar);
    String strAvatarUri = Preferences.getString(PREFERENCES_AVATAR, "");
    Uri imageUri = Uri.parse(strAvatarUri);
    avatarButton.setImageURI(null);
    avatarButton.setImageURI(imageUri);
    

    This refreshes the image button so the user can see the image they have taken. However, this is appears very big and fills the screen. Is there any way i can compress or downsize the image so the user can see it at a reasonable size? thanks

  • Shade
    Shade over 13 years
    But that way you will have the full bitmap loaded in memory. If you do it in the way I have suggested, you load the full bitmap, create the scaled-down version and later, the loaded full bitmap gets garbage-collected.
  • Shirish Herwade
    Shirish Herwade over 11 years
    @Shade please tell how to "create the scaled-down version"
  • Shade
    Shade over 11 years
    @Why and How, see my answer below.