将位图缩放到特定大小,保持纵横比并用 0 alpha 像素填充其余部分

Scale bitmap to specific size, keeping aspect ratio and filling the rest with 0 alpha pixels

我一直在寻找这个问题的解决方案很长一段时间,但还没有找到满足我需求的东西。

我想在保持宽高比的同时将位图缩放到特定大小。 将其视为在 ImageView 中使用 fitCenter 缩放位图,仅在新位图中。

源位图必须适合具有特定大小的目标位图,其余像素必须是透明的。

我试过像这样使用 Glide:

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

但此方法returns 位图仅适合宽度(或高度)并包装尺寸。

我听说使用 Canvas 是一个可能的解决方案,但还没有找到任何方法来实现我的目标。

任何帮助或见解将不胜感激。如果需要,我会 post 任何需要的说明。

我设法用这个函数解决了它:

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