Подтвердить что ты не робот

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

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

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

Ответ 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;
    }

}