Как изменить размер изображения (битмап) до заданного размера?
Как изменить размер изображения (битмап) до, например, 800 * 480 программно? Я получил изображение в моем приложении, которое составляет ~ 1 МБ, и мне нужно масштабировать его до 800 * 480
Я загрузил это изображение и сжал его, но как это сделать, чтобы сделать его меньше:
ByteArrayOutputStream bos = new ByteArrayOutputStream(8192);
photo.compress(CompressFormat.JPEG, 25, bos);
Ответы
Ответ 1
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;
}
Ответ 2
Вы можете масштабировать растровые изображения с помощью 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;
}
Ответ 3
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);
Ответ 4
Другие ответы правильны относительно "как", чтобы изменить их размер, но я бы также бросил рекомендацию, чтобы просто получить нужную вам резолюцию, для начала. Большинство устройств Android предлагают ряд разрешений, и вы должны выбрать тот, который дает вам размер файла, с которым вам удобно. Самая большая причина этого в том, что собственный алгоритм масштабирования Android (как подробно описано Jin35 и Padma Kumar) дает довольно дрянные результаты. Это не приведет к изменению размера изображения в Photoshop, даже уменьшению масштаба (не говоря уже об масштабировании, о котором я знаю, о котором вы не спрашиваете, но это просто не стартер).
Итак, вы должны попробовать свое решение, и если вы довольны результатом, отлично. Но если нет, я бы написал функцию, которая предлагает диапазон ширины, которым вы довольны, и ищет это измерение (или что-то еще самое близкое) в доступном массиве размера изображения устройства и просто установите его и используйте.
Ответ 5
В MonoDroid вот как (С#)
/// <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;
}
}