How to resize image (Bitmap) to a given size?

AndroidBitmap

Android Problem Overview


How to resize image (Bitmap) to for example 800480 programatically ? I have retrieved a picture in my app which is ~1MB and I need to scale it down to 800480 I have loaded that picture and compressed it but how do I do to make it smaller :

ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos); 

Android Solutions


Solution 1 - Android

Bitmap scaledBitmap = scaleDown(realImage, MAX_IMAGE_SIZE, true);

Scale down method:

public static Bitmap scaleDown(Bitmap realImage, float maxImageSize,
        boolean filter) {
    float ratio = Math.min(
            (float) maxImageSize / realImage.getWidth(),
            (float) maxImageSize / realImage.getHeight());
    int width = Math.round((float) ratio * realImage.getWidth());
    int height = Math.round((float) ratio * realImage.getHeight());

    Bitmap newBitmap = Bitmap.createScaledBitmap(realImage, width,
            height, filter);
    return newBitmap;
}

Solution 2 - Android

 Bitmap yourBitmap;
 Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true);

or:

 resized = Bitmap.createScaledBitmap(yourBitmap,(int)(yourBitmap.getWidth()*0.8), (int)(yourBitmap.getHeight()*0.8), true);

Solution 3 - Android

You can scale bitmaps by using canvas.drawBitmap with providing matrix, for example:

public static Bitmap scaleBitmap(Bitmap bitmap, int wantedWidth, int wantedHeight) {
		Bitmap output = Bitmap.createBitmap(wantedWidth, wantedHeight, Config.ARGB_8888);
		Canvas canvas = new Canvas(output);
		Matrix m = new Matrix();
		m.setScale((float) wantedWidth / bitmap.getWidth(), (float) wantedHeight / bitmap.getHeight());
		canvas.drawBitmap(bitmap, m, new Paint());

		return output;
	}

Solution 4 - Android

The other answers are correct as to "how" to resize them, but I would also thrown in the recommendation to just grab the resolution you are interested in, to begin with. Most Android devices offer a range of resolutions and you should pick one that gives you a file size that you're comfortable with. The biggest reason for this is that the native Android scaling algorithm (as detailed by Jin35 and Padma Kumar) produces pretty crappy results. It's not going to give you Photoshop quality resizing, even downscaling (to say nothing of upscaling, which I know you're not asking about, but that's just a non-starter).

So, you should try their solution and if you're happy with the outcome, great. But if not, I'd write a function that offers a range of width that you're happy with, and looks for that dimension (or whatever's closest) in the device's available picture size array and just set it and use it.

Solution 5 - Android

In MonoDroid here's how (c#)

/// <summary>
/// Graphics support for resizing images
/// </summary>
public static class Graphics
{
	public static Bitmap ScaleDownBitmap(Bitmap originalImage, float maxImageSize, bool filter)
	{
		float ratio = Math.Min((float)maxImageSize / originalImage.Width, (float)maxImageSize / originalImage.Height);
		int width = (int)Math.Round(ratio * (float)originalImage.Width);
		int height =(int) Math.Round(ratio * (float)originalImage.Height);

		Bitmap newBitmap = Bitmap.CreateScaledBitmap(originalImage, width, height, filter);
		return newBitmap;
	}

	public static Bitmap ScaleBitmap(Bitmap originalImage, int wantedWidth, int wantedHeight)
	{
		Bitmap output = Bitmap.CreateBitmap(wantedWidth, wantedHeight, Bitmap.Config.Argb8888);
		Canvas canvas = new Canvas(output);
		Matrix m = new Matrix();
		m.SetScale((float)wantedWidth / originalImage.Width, (float)wantedHeight / originalImage.Height);
		canvas.DrawBitmap(originalImage, m, new Paint());
		return output;
	}

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDamirView Question on Stackoverflow
Solution 1 - AndroidPadma KumarView Answer on Stackoverflow
Solution 2 - AndroidVaishali SutariyaView Answer on Stackoverflow
Solution 3 - AndroidJin35View Answer on Stackoverflow
Solution 4 - AndroidYevgeny SimkinView Answer on Stackoverflow
Solution 5 - AndroidIan VinkView Answer on Stackoverflow