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

时间:2016-02-23 09:22:39

标签: android bitmap android-canvas android-glide

我已经在很长一段时间内一直在寻找解决这个问题的方法,而且还没有找到符合我需求的东西。

我想在保持宽高比的同时将位图缩放到特定大小。 可以把它想象成在ImageView中使用fitCenter缩放位图,只在新的位图中。

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

我尝试过像这样使用Glide:

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

但是这个方法返回一个只适合宽度(或高度)并包装大小的位图。

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

非常感谢任何帮助或见解。如果要求,我会发布任何必要的澄清。

1 个答案:

答案 0 :(得分:0)

我设法使用此功能解决了它:

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