将位图大小调整为 512x512 而不改变原始纵横比
Resize Bitmap to 512x512 Without changing original aspect ratio
我创建了位图。尺寸不具体。有时是 120x60、129x800、851x784。它没有特定的值...我想让这些位图始终调整为 512x512,但不改变原始图像的纵横比。并且没有裁剪。新图片必须 canvas 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;
}
我有什么;
我想要的;
好的,所以你真的很接近。我现在无法对此进行测试,但基本上需要更改的是
1) 您需要对 X 和 Y 应用相同的比例,因此您需要选择较小的(如果不起作用,请尝试较大的)。
matrix.postScale(Math.min(scaleWidth, scaleHeight), Math.min(scaleWidth, scaleHeight));
2) 结果将是位图,其中至少一侧大 512px,另一侧小。因此,您需要添加填充以使该侧适合 512px(等左和 right/top 和底部居中)。为此,您需要创建所需大小的新位图:
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) 现在 return outputImage
这是 Kotlin 中的一个简化,它使用矩阵进行缩放和平移,跳过中间位图。
请注意,它还将新像素的背景颜色设置为白色,这是我的图像管道所需要的。如果您不需要它,请随时将其删除。
fun resizedBitmapWithPadding(bitmap: Bitmap, newWidth: Int, newHeight: Int) : Bitmap {
val scale = min(newWidth.toFloat() / bitmap.width, newHeight.toFloat() / bitmap.height)
val scaledWidth = scale * bitmap.width
val scaledHeight = scale * bitmap.height
val matrix = Matrix()
matrix.postScale(scale, scale)
matrix.postTranslate(
(newWidth - scaledWidth) / 2f,
(newHeight - scaledHeight) / 2f
)
val outputBitmap = Bitmap.createBitmap(newWidth, newHeight, bitmap.config)
outputBitmap.eraseColor(Color.WHITE)
Canvas(outputBitmap).drawBitmap(
bitmap,
matrix,
null
)
return outputBitmap
}
我创建了位图。尺寸不具体。有时是 120x60、129x800、851x784。它没有特定的值...我想让这些位图始终调整为 512x512,但不改变原始图像的纵横比。并且没有裁剪。新图片必须 canvas 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;
}
我有什么;
我想要的;
好的,所以你真的很接近。我现在无法对此进行测试,但基本上需要更改的是
1) 您需要对 X 和 Y 应用相同的比例,因此您需要选择较小的(如果不起作用,请尝试较大的)。
matrix.postScale(Math.min(scaleWidth, scaleHeight), Math.min(scaleWidth, scaleHeight));
2) 结果将是位图,其中至少一侧大 512px,另一侧小。因此,您需要添加填充以使该侧适合 512px(等左和 right/top 和底部居中)。为此,您需要创建所需大小的新位图:
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) 现在 return outputImage
这是 Kotlin 中的一个简化,它使用矩阵进行缩放和平移,跳过中间位图。
请注意,它还将新像素的背景颜色设置为白色,这是我的图像管道所需要的。如果您不需要它,请随时将其删除。
fun resizedBitmapWithPadding(bitmap: Bitmap, newWidth: Int, newHeight: Int) : Bitmap {
val scale = min(newWidth.toFloat() / bitmap.width, newHeight.toFloat() / bitmap.height)
val scaledWidth = scale * bitmap.width
val scaledHeight = scale * bitmap.height
val matrix = Matrix()
matrix.postScale(scale, scale)
matrix.postTranslate(
(newWidth - scaledWidth) / 2f,
(newHeight - scaledHeight) / 2f
)
val outputBitmap = Bitmap.createBitmap(newWidth, newHeight, bitmap.config)
outputBitmap.eraseColor(Color.WHITE)
Canvas(outputBitmap).drawBitmap(
bitmap,
matrix,
null
)
return outputBitmap
}