Как изменить размер изображения (битмап) до заданного размера?

Как изменить размер изображения (битмап) до, например, 800 * 480 программно? Я получил изображение в моем приложении, которое составляет ~ 1 МБ, и мне нужно масштабировать его до 800 * 480. Я загрузил это изображение и сжал его, но как сделать, чтобы уменьшить его:

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

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

Метод масштабирования:

 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; } 

Вы можете масштабировать растровые изображения с помощью canvas.drawBitmap с помощью матрицы, например:

 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; } 
  Bitmap yourBitmap; Bitmap resized = Bitmap.createScaledBitmap(yourBitmap, newWidth, newHeight, true); 

или:

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

Другие ответы правильны, как «как» изменить их размер, но я также хотел бы бросить рекомендацию, чтобы просто получить нужную вам резолюцию. Большинство устройств Android предлагают ряд разрешений, и вы должны выбрать тот, который дает вам размер файла, который вам удобнее. Самая большая причина этого заключается в том, что собственный алгоритм масштабирования Android (как описано Jin35 и Padma Kumar) дает довольно дрянные результаты. Это не приведет к изменению размера изображения в Photoshop, даже уменьшению масштаба (не говоря уже о масштабировании, о котором я знаю, о котором вы не спрашиваете, но это просто не стартер).

Итак, вы должны попробовать свое решение, и если вы довольны результатом, отлично. Но если нет, я бы написал функцию, которая предлагает диапазон ширины, которым вы довольны, и ищет это измерение (или что-то самое близкое) в доступном массиве размера изображения устройства, и просто установите его и используйте.

В MonoDroid вот как (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; } }