Масштабируйте растровое изображение до определенного размера, сохраняя соотношение сторон и заполняя остальное 0 альфа-пикселями

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

Я хочу масштабировать растровое изображение до определенного размера, сохраняя при этом соотношение сторон. Думайте об этом как о масштабировании растрового изображения с помощью fitCenter в ImageView, только в новом растровом изображении.

Исходное растровое изображение должно соответствовать растровому изображению назначения, которое имеет определенный размер, а остальные пиксели должны быть прозрачными.

Я пробовал использовать Glide вот так:

Glide.with(context).load(url)
                            .asBitmap()
                            .override(1280, 720)
                            .fitCenter()
                            .into(1280, 720)
                            .get();

Но этот метод возвращает растровое изображение, которое соответствует только ширине (или высоте), и обертывает размер.

Я слышал, что использование Canvas - возможное решение, но не нашел способа достичь своей цели с его помощью.

Приветствуется любая помощь или понимание. Если потребуется, я опубликую все необходимые разъяснения.


person Rakatan    schedule 23.02.2016    source источник


Ответы (1)


Мне удалось решить эту проблему с помощью этой функции:

Bitmap resizeBitmap(Bitmap image, int destWidth, int destHeight) {
    Bitmap background = Bitmap.createBitmap(destWidth, destHeight, Bitmap.Config.ARGB_8888);
    float originalWidth = image.getWidth();
    float originalHeight = image.getHeight();
    Canvas canvas = new Canvas(background);

    float scaleX = (float) 1280 / originalWidth;
    float scaleY = (float) 720 / originalHeight;

    float xTranslation = 0.0f;
    float yTranslation = 0.0f;
    float scale = 1;

    if (scaleX < scaleY) { // Scale on X, translate on Y
        scale = scaleX;
        yTranslation = (destHeight - originalHeight * scale) / 2.0f;
    } else { // Scale on Y, translate on X
        scale = scaleY;
        xTranslation = (destWidth - originalWidth * scale) / 2.0f;
    }

    Matrix transformation = new Matrix();
    transformation.postTranslate(xTranslation, yTranslation);
    transformation.preScale(scale, scale);
    Paint paint = new Paint();
    paint.setFilterBitmap(true);
    canvas.drawBitmap(image, transformation, paint);
    return background;
}
person Rakatan    schedule 24.02.2016