0

I'm writing a Music application and I have already gotten the album arts. However, they came up in various sizes. So, how do I standardized the size of the returned bitmap ?

Ye Myat Min
  • 1,429
  • 2
  • 17
  • 29

3 Answers3

4

You'd do something like this:

// load the origial BitMap (500 x 500 px)
        Bitmap bitmapOrg = BitmapFactory.decodeResource(getResources(),
               R.drawable.android);

        int width = bitmapOrg.width();
        int height = bitmapOrg.height();
        int newWidth = 200;
        int newHeight = 200;

        // calculate the scale - in this case = 0.4f
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;

        // createa matrix for the manipulation
        Matrix matrix = new Matrix();
        // resize the bit map
        matrix.postScale(scaleWidth, scaleHeight);

        // recreate the new Bitmap
        Bitmap resizedBitmap = Bitmap.createBitmap(bitmapOrg, 0, 0,
                          width, height, matrix, true);
xil3
  • 16,305
  • 8
  • 63
  • 97
0

In my experience the code in the accepted answer does not work, at least on some platforms.

Bitmap.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);

will give you a downsampled image at the full size of the original - so just a blurry image.

Interestingly enough, the code

Bitmap resizedBitmap = Bitmap.createScaledBitmap(square, (int) targetWidth, (int) targetHeight, false);

also gives the blurry image. In my case it was necessary to do this:

// RESIZE THE BIT MAP

// According to a variety of resources, this function should give us pixels from the dp of the screen
// From http://stackoverflow.com/questions/4605527/converting-pixels-to-dp-in-android
float targetHeight = DWUtilities.convertDpToPixel(80, getActivity());
float targetWidth = DWUtilities.convertDpToPixel(80, getActivity());

// However, the above pixel dimension are still too small to show in my 80dp image view
// On the Nexus 4, a factor of 4 seems to get us up to the right size
// No idea why.
targetHeight *= 4;
targetWidth *= 4;

matrix.postScale( (float) targetHeight / square.getWidth(), (float) targetWidth / square.getHeight());


Bitmap resizedBitmap = Bitmap.createBitmap(square, 0, 0, square.getWidth(), square.getHeight(), matrix, false); 

// By the way, the below code also gives a full size, but blurry image
// Bitmap resizedBitmap = Bitmap.createScaledBitmap(square, (int) targetWidth, (int) targetHeight, false

I don't have a further solution on this yet, but hopefully this is helpful to someone.

deepwinter
  • 4,568
  • 2
  • 31
  • 37
0

Or you could scale the bitmap to the required size when you draw it on the canvas:

From the android documentation:

drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) Draw the specified bitmap, scaling/translating automatically to fill the destination rectangle.

Make src null and dst is a Rect the size/position you want it on the canvas, set up like

Rect rect = new Rect(0, 0, width, height)
canvas.drawBitmap(bitmap, null, rect)
FrinkTheBrave
  • 3,894
  • 10
  • 46
  • 55