You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过坐标将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,提问作者Дмитрий Ефимов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:05:26