Edijae Crusar
Edijae Crusar

Reputation: 3541

How to reduce bitmap quality without affecting it's size

is there a way i can compress an image of 115kb to be 4kb in android Without affecting it size?. just reducing it quality?

i only know of using

public Bitmap compressImage(String imagePath) {

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
   bmp = BitmapFactory.decodeStream(new FileInputStream(imagePath),null, options);


  options.inSampleSize = calculateInSampleSize(options, actualWidth, actualHeight);
  options.inJustDecodeBounds = false;
    bmp = BitmapFactory.decodeStream(new FileInputStream(imagePath),null, options);

  return bmp;
}



public  int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
  final int height = options.outHeight;
  final int width = options.outWidth;
  int inSampleSize = 1;

  if (height > reqHeight || width > reqWidth) {
    final int heightRatio = Math.round((float) height / (float) reqHeight);
    final int widthRatio = Math.round((float) width / (float) reqWidth);
    inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
  }
  final float totalPixels = width * height;
  final float totalReqPixelsCap = reqWidth * reqHeight * 2;

  while (totalPixels / (inSampleSize * inSampleSize) > totalReqPixelsCap) {
    inSampleSize++;
  }

  return inSampleSize;
}

Upvotes: 3

Views: 8336

Answers (2)

Faizzy
Faizzy

Reputation: 1

public static int getSquareCropDimensionForBitmap(Bitmap bitmap)
{
    int dimension;
    //If the bitmap is wider than it is tall
    //use the height as the square crop dimension
    if (bitmap.getWidth() >= bitmap.getHeight())
    {
        dimension = bitmap.getHeight();
    }
    //If the bitmap is taller than it is wide
    //use the width as the square crop dimension
    else
    {
        dimension = bitmap.getWidth();
    }

return  dimension;
}

int dimension = getSquareCropDimensionForBitmap(bitmap);

        System.out.println("before cropped height " + bitmap.getHeight() + "and width: " + bitmap.getWidth());
        Bitmap croppedBitmap = ThumbnailUtils.extractThumbnail(bitmap, dimension, dimension);
        System.out.println("after cropped height "+croppedBitmap.getHeight() +"and width: " + croppedBitmap.getWidth());

it can crop and can reduce size u can specify ur own size

Upvotes: 0

OBX
OBX

Reputation: 6114

Image re sizing means you're going to shorten the resolution of the image. suppose user selects a 1000*1000 px image. you're going to convert the image into a 300*300 image. thus image size will be reduced.

And Image compression is lowering the file size of the image without compromising the resolution. Of course lowering file size will affect the quality of the image. There are many compression algorithm available which can reduce the file size without much affecting the image quality.

One handy way I found in here is :

    Bitmap original = BitmapFactory.decodeStream(getAssets().open("1024x768.jpg"));
ByteArrayOutputStream out = new ByteArrayOutputStream();
original.compress(Bitmap.CompressFormat.PNG, 100, out);
Bitmap decoded = BitmapFactory.decodeStream(new ByteArrayInputStream(out.toByteArray()));

Log.e("Original   dimensions", original.getWidth()+" "+original.getHeight());
Log.e("Compressed dimensions", decoded.getWidth()+" "+decoded.getHeight());

gives

12-07 17:43:36.333: E/Original dimensions(278): 1024 768 12-07

17:43:36.333: E/Compressed dimensions(278): 1024 768

Upvotes: 1

Related Questions