最近搜索

java 代码生成海报

浏览:23
管理员 2025-08-04 00:19



如果不设置 字体 中文显示乱码。


package java456.com.utils;

import com.alibaba.fastjson2.JSONObject;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Date;

public class HaiBaoUtil {


    public  static  void main(String[] s){
        try {
            System.out.println("系统编码: " + System.getProperty("file.encoding"));
            System.out.println("默认字体: " + new Font(null).getFontName());

            String uploadFile2 = "/static/xcx_haibao/123456/";
            String fileName = DateUtil.formatDate(new Date(), "yyyyMMddHHmmssSSS") + ".png";
            JSONObject param = new JSONObject();
            String webPath = "D:\\idea_space\\xcx_api_lvyou2\\src\\main\\webapp\\";
            param.put("img1", webPath+"/static/upload_image/blog_cover/20250624/20250624004044.jpg");

            param.put("img2",webPath+"/static/upload_image/blog_cover/20250624/20250624004044.jpg");
            param.put("font", "D:\\idea_space\\xcx_api_lvyou2\\src\\main\\resources\\font\\msyh.ttc");
            FileUtil.makeDirs(webPath + uploadFile2);
            HaiBaoUtil.create(param,webPath + uploadFile2+ fileName);

//            create();
        }catch (Exception e){
            System.out.println(e);
        }
    }

    /**
     * 创建一个海报 保存到指定位置。
     */
    public static void create (JSONObject param, String outputPath) throws  Exception{
        // 创建海报画布
        int width = 450;
        int height = 800;
        BufferedImage poster = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = poster.createGraphics();

        // 设置背景色为白色
        graphics.setColor(Color.WHITE);
        graphics.fillRect(0, 0, width, height);

        // 设置文字属性
//        int fontSize =  15;
//        Font font = new Font("Arial", Font.PLAIN, fontSize);
//        graphics.setFont(font);


        Font font = Font.createFont(
                Font.TRUETYPE_FONT,
                new File(param.getString("font"))  // 微软雅黑字体
        ).deriveFont(24f);  // 设置字号
        graphics.setFont(font);  // 应用字体


        String fontColor = "#000000";
        graphics.setColor(Color.decode(fontColor));

        // 计算文字位置
        FontMetrics metrics = graphics.getFontMetrics();
        int textHeight = metrics.getHeight();


        // 绘制第一行文字
        String textLine1 ="小米商城";
        int textWidth = metrics.stringWidth(textLine1);
        int x1 = 100;
        int y1 = 50; // 第一行文字起始Y坐标
        graphics.drawString(textLine1, x1, y1);

        // 绘制第二行文字
        font = Font.createFont(
                Font.TRUETYPE_FONT,
                new File(param.getString("font"))  // 微软雅黑字体
        ).deriveFont(15f);  // 设置字号
        graphics.setFont(font);  // 应用字体
        fontColor = "#424242";
        graphics.setColor(Color.decode(fontColor));

        String textLine2="第二行文字Y坐标";
        int x2  =100;
        int y2  =80;
        graphics.drawString(textLine2, x2, y2);


        // 加载并绘制第一张图片
        double image1Scale = 1;
        //背景透明的图片 画到上面也是透明的   不管是什么格式 jpg 和 png 都是一样效果
        String image1Url =  param.getString("img1")  ;
        BufferedImage img1 = ImageIO.read(new File(image1Url));
        int img1Width = 60;
        int img1Height = 60;
        int img1X = 25;
        int img1Y = 25;
        int cornerRadius = 10; // 圆角半径,可调整
        // 使用圆角绘制方法
        RoundImageUtil.drawRoundImage(graphics, img1, img1X, img1Y,
                img1Width, img1Height, cornerRadius);

        //普通绘制 方形
        //graphics.drawImage(img1, img1X, img1Y, img1Width, img1Height, null);


        // 加载并绘制第二张图片
        double image2Scale =  1;
        String image2Url = param.getString("img2")  ;
        BufferedImage img2 = ImageIO.read(new File(image2Url));
        int img2Width =  400;
        int img2Height = 400;
        int img2X = 25;
        int img2Y = 125;
        // 使用圆角绘制方法
        RoundImageUtil.drawRoundImage(graphics, img2, img2X, img2Y,
                img2Width, img2Height, cornerRadius);
        //普通绘制 方形
        //graphics.drawImage(img2, img2X, img2Y, img2Width, img2Height, null);

        // 保存海报
        File outputFile = new File(outputPath);
        //String outputPath = "21111.png";  //保存工程 下面 和  src target 同级别
        ImageIO.write(poster, "png", new File(outputPath));
        graphics.dispose();
    }

}




画圆角的方法

package java456.com.utils;

import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class RoundImageUtil {

    // 生成圆角图片
    public static BufferedImage makeRoundedCorner(BufferedImage image, int cornerRadius) {
        int width = image.getWidth();
        int height = image.getHeight();

        BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = output.createGraphics();

        // 启用抗锯齿
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        // 创建圆角矩形裁剪区域
        RoundRectangle2D round = new RoundRectangle2D.Float(0, 0, width, height, cornerRadius, cornerRadius);
        g2.setClip(round);

        // 绘制原始图片
        g2.drawImage(image, 0, 0, null);
        g2.dispose();

        return output;
    }

    // 在指定位置绘制圆角图片
    public static void drawRoundImage(Graphics2D graphics, BufferedImage image,
                                      int x, int y, int width, int height, int cornerRadius) {
        // 缩放图片到目标尺寸
        BufferedImage resized = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = resized.createGraphics();
        g.drawImage(image.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
        g.dispose();

        // 应用圆角效果
        BufferedImage rounded = makeRoundedCorner(resized, cornerRadius);
        graphics.drawImage(rounded, x, y, null);
    }
}





spring boot调用

    /**
     * /admin/blog/add
     */
    @ResponseBody
    @RequestMapping("/add")
    public JSONObject add(Blog blog  , HttpServletResponse response, HttpServletRequest request, HttpSession session) throws Exception {
        JSONObject result = new JSONObject();
        String webPath = request.getServletContext().getRealPath("");

        blog.setCreateDateTime(new Date());
        blog.setState(0);//0未审校   1已审核
        blog.setClickHit(0);//查看 次数
        blog.insert();

//        //生成一个小程序二维码
//        String  xcx_qr_path = "pages/blog_view/blog_view";
//        Integer xcx_qr_width = 80;
//        String scene =  blog.getId()+"__123";//如果推广的话 后的参数 应该是动态的。  不知道小程序 二维码 一个能创建几个。
//        JSONObject token = (JSONObject) servletContext.getAttribute("token");
//        String base64String = WeiXinBufferToImage.bufferToBase64(token.getString("access_token"), xcx_qr_path,  xcx_qr_width, scene);
//        String uploadFile = "/static/xcx_qr/" + DateUtil.formatDate(new Date(), "yyyyMMdd") + "/";
//        String fileName = DateUtil.formatDate(new Date(), "yyyyMMddHHmmssSSS") + ".jpg";
//        //调用产生文件夹的方法
//        FileUtil.makeDirs(webPath + uploadFile);
//        Base64Util.GenerateImage(base64String, webPath + uploadFile + fileName);
//        blog.setQrUrl(uploadFile + fileName);
//        blogService.updateById(blog);

        String uploadFile2 = "/static/xcx_haibao/" + DateUtil.formatDate(new Date(), "yyyyMMdd") + "/";
        FileUtil.makeDirs(webPath + uploadFile2);
        String fileName = DateUtil.formatDate(new Date(), "yyyyMMddHHmmssSSS") + ".jpg";
        JSONObject param = new JSONObject();
        param.put("img1", webPath+"/static/upload_image/blog_cover/20250624/20250624004044.jpg");
        param.put("img2",webPath+"/static/upload_image/blog_cover/20250624/20250624004044.jpg");
        param.put("font",WeiXinUtil.FONT);
        HaiBaoUtil.create(param,webPath + uploadFile2+ fileName);

        result.put("success", true);
        result.put("msg", "添加成功");
        result.put("btn_disable", true);
        return result;

    }

image.png



这个字体的位置 是这样配置。

image.png


字体下载


字体下载点这里  字体有点大。没有上传成功。

字体是从  c://windows/font 下面复制的

image.png


这个复制出来就是  那3个文件。




image.png



联系站长

站长微信:xiaomao0055

站长QQ:14496453