Изменение размера растрового изображения до 512x512 без изменения исходного соотношения сторон - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть созданные растровые изображения.Размеры не являются конкретными.Иногда 120х60, 129х800, 851х784.У него нет определенного значения ... Я хочу, чтобы эти растровые изображения всегда изменяли размер до 512x512, но без изменения соотношения сторон исходного изображения.И без обрезки.Новое изображение должно иметь холст 512x512, а исходное изображение должно быть по центру без обрезки.

Я изменял размеры своих растровых изображений с помощью этой функции, но это делает изображения действительно плохими, потому что изображения соответствуют X и Y.Я не хочу, чтобы изображение соответствовало x и y одновременно, соответствует одному из них и сохраняет его соотношение сторон.

 public Bitmap getResizedBitmap(Bitmap bm, int newWidth, int newHeight) {
        int width = bm.getWidth();
        int height = bm.getHeight();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        // CREATE A MATRIX FOR THE MANIPULATION
        Matrix matrix = new Matrix();
        // RESIZE THE BIT MAP
        matrix.postScale(scaleWidth, scaleHeight);

        // "RECREATE" THE NEW BITMAP
        Bitmap resizedBitmap = Bitmap.createBitmap(
                bm, 0, 0, width, height, matrix, false);
        bm.recycle();
        return resizedBitmap;
    }

То, что у меня есть;

enter image description here

Что я хочу;

enter image description here

1 Ответ

0 голосов
/ 13 декабря 2018

Хорошо, так что вы действительно близко.Я не могу проверить это прямо сейчас, но в основном нужно изменить

1) Вам нужно применить одинаковую шкалу к X и Y, поэтому вам нужно выбрать меньшую (попробуйте большуюодин, если это не сработает).

matrix.postScale(Math.min(scaleWidth, scaleHeight), Math.min(scaleWidth, scaleHeight));

2) Результатом будет растровое изображение, в котором по крайней мере одна сторона будет иметь размер 512 пикселей, а другая будет меньше.Таким образом, вам нужно добавить отступ, чтобы соответствовать этой стороне до 512 пикселей (одинаково слева и справа / сверху и снизу для центрирования).Для этого вам нужно создать новое растровое изображение нужного размера:

Bitmap outputimage = Bitmap.createBitmap(512,512, Bitmap.Config.ARGB_8888);

3) и, наконец, в зависимости от того, какая сторона resizedBitmap равна 512px, вам нужно нарисовать resizedBitmap, чтобыправильная позиция в outputImage

Canvas can = new Canvas(outputimage);
can.drawBitmap(resizedBitmap, (512 - resizedBitmap.getWidth()) / 2, (512 - resizedBitmap.getHeight()) / 2, null);

Обратите внимание, что 512 - resizedBitmap.getWidth() приводит к 0 и, следовательно, нет отступов сбоку с правильным размером.

4) Теперь вернемся outputImage

...