Java缩放BufferedImage保持宽高比并填充白色背景实现方法
Java 实现图片等比缩放+白色边距居中
原有实现直接把原图拉伸到目标尺寸,没有做比例计算、背景填充和居中偏移计算,按如下方式修改resizeImage方法即可满足需求:
import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; private static BufferedImage resizeImage(BufferedImage originalImage, int targetWidth, int targetHeight) { int originalWidth = originalImage.getWidth(); int originalHeight = originalImage.getHeight(); // 计算等比缩放比例,取宽高缩放比的较小值,保证图片完整显示不超出画布 double scale = Math.min( (double) targetWidth / originalWidth, (double) targetHeight / originalHeight ); int scaledWidth = (int) Math.round(originalWidth * scale); int scaledHeight = (int) Math.round(originalHeight * scale); // 计算居中绘制的坐标偏移量 int offsetX = (targetWidth - scaledWidth) / 2; int offsetY = (targetHeight - scaledHeight) / 2; // 创建目标尺寸画布,jpg不支持透明,统一用RGB类型避免背景发黑 BufferedImage result = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB); Graphics2D g = result.createGraphics(); // 先将整个画布填充为白色 g.setColor(Color.WHITE); g.fillRect(0, 0, targetWidth, targetHeight); // 配置高质量渲染参数,避免缩放后图片模糊、有锯齿 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 将缩放后的图片绘制到画布居中位置 g.drawImage(originalImage, offsetX, offsetY, scaledWidth, scaledHeight, null); g.dispose(); return result; }
关键说明
- 不要直接使用原图的
getType()创建画布:如果原图带透明通道,写入jpg格式时未填充的区域会默认显示为黑色,统一使用TYPE_INT_RGB搭配全画布白色填充可以彻底避免这个问题。 - 缩放比例取宽、高两个维度缩放值的最小值,保证缩放后的图片完整容纳在画布内,不会出现内容裁切。
- 偏移量通过目标尺寸和缩放后尺寸的差值除以2计算,自动实现上下、左右边距均等的居中效果。
- 新增的渲染提示参数用于优化缩放画质,相比默认绘制模式,能明显减少图片缩放后的锯齿、模糊问题。
以200x200原图转400x300尺寸的场景为例:宽方向缩放比为2,高方向缩放比为1.5,取最小值1.5计算得缩放后尺寸为300x300,x轴偏移量为50、y轴偏移量为0,最终输出的图片左右各留50像素白边,图片居中放置,完全符合预期效果。
内容的提问来源于stack exchange,提问作者Dropen77
相关产品推荐
相关产品推荐

