将位图缩放到特定大小,保持纵横比并用 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;
}
我一直在寻找这个问题的解决方案很长一段时间,但还没有找到满足我需求的东西。
我想在保持宽高比的同时将位图缩放到特定大小。 将其视为在 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;
}