如何通过坐标将MultipartFile图片插入到16:9黑色背景图中?
解决方案
首先,你需要先判断原图的宽高比是否为16:9,若不是则计算原图缩放后的尺寸与居中坐标,再通过Graphics2D.drawImage()将原图绘制到黑色背景上。关键是不要提前调用g2d.dispose(),要在完成所有绘制操作后再释放资源。以下是修正后的完整代码:
import org.springframework.web.multipart.MultipartFile; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public static String getImageAndReturnPathToResult(MultipartFile multipartFile) { // 定义16:9背景图的尺寸 final int BG_WIDTH = 1920; final int BG_HEIGHT = 1080; final double TARGET_RATIO = 16.0 / 9.0; try { // 读取前端传入的原图 BufferedImage originalImage = ImageIO.read(multipartFile.getInputStream()); int originalWidth = originalImage.getWidth(); int originalHeight = originalImage.getHeight(); double originalRatio = (double) originalWidth / originalHeight; // 如果原图比例已经是16:9,直接返回原图路径(可根据需求调整逻辑) if (Math.abs(originalRatio - TARGET_RATIO) < 0.001) { File outputFile = new File("存储路径/原图文件名.jpg"); ImageIO.write(originalImage, "jpg", outputFile); return outputFile.getAbsolutePath(); } // 创建黑色背景图 BufferedImage backgroundImage = new BufferedImage(BG_WIDTH, BG_HEIGHT, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = backgroundImage.createGraphics(); // 绘制黑色背景 g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, BG_WIDTH, BG_HEIGHT); // 计算原图缩放后的尺寸(保持原比例,且不超出背景图范围) int scaledWidth, scaledHeight; if (originalRatio > TARGET_RATIO) { // 原图更宽,以背景宽度为基准缩放 scaledWidth = BG_WIDTH; scaledHeight = (int) (BG_WIDTH / originalRatio); } else { // 原图更高,以背景高度为基准缩放 scaledHeight = BG_HEIGHT; scaledWidth = (int) (BG_HEIGHT * originalRatio); } // 计算居中绘制的坐标 int x = (BG_WIDTH - scaledWidth) / 2; int y = (BG_HEIGHT - scaledHeight) / 2; // 将缩放后的原图绘制到背景图的居中位置 g2d.drawImage(originalImage, x, y, scaledWidth, scaledHeight, null); // 释放图形资源 g2d.dispose(); // 保存最终合成的图片到指定路径 File outputFile = new File("存储路径/合成后文件名.jpg"); ImageIO.write(backgroundImage, "jpg", outputFile); return outputFile.getAbsolutePath(); } catch (IOException e) { e.printStackTrace(); } return "error"; }
关键说明
- 比例判断:用
Math.abs(originalRatio - TARGET_RATIO) < 0.001规避浮点数精度问题导致的误判 - 缩放逻辑:保证原图完整显示在背景内,同时保留原有宽高比
- 绘制时机:必须在填充黑色背景后绘制原图,且所有绘制操作完成后再调用
g2d.dispose(),否则会导致绘制失效 - 路径配置:请将代码中的存储路径替换为实际的文件存储目录
内容的提问来源于stack exchange,提问作者Дмитрий Ефимов
相关产品推荐
相关产品推荐

