工程实践

【magic-api】使用脚本实现图片编辑添加图文

· 三面体

图片编辑,用于签发证书奖状等图文混合场景。 注意需要安装中文字体。 import java.net.InetAddress import cn.hutool.core.date.DateUtil import java.io.File import java.io.FileInputStream import java

magic-api

图片编辑,用于签发证书奖状等图文混合场景。注意需要安装中文字体。

import java.net.InetAddress
import cn.hutool.core.date.DateUtil
import java.io.File
import java.io.FileInputStream
import java.net.URL
import java.awt.Font
import cn.hutool.core.img.ImgUtil;
import org.springframework.core.io.ClassPathResource;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import response;
import java.time.ZoneId

//系统需要安装中文字体

var applyComplete = {
    "certificateNo": "120120xxxx121212",
    "currentPosition": "地址信息",
    "certificateDesc": "描述信息",
    "signedDate": "2024年2月21日17:37:34",
    "signedUnit": "测试",
    "signedUnitOffice": "公司名称",
    "startTime": "2024-02",
    "company": "公司名称",
    "talent_type":"C类人才",
    "apply_user":"张三"
}



int length = applyComplete.certificateNo.length();

var relativePath = "/home/indicator/uploadPath/upload/2024/02/21/56583ac5-4591-4be5-a95a-481ff92799fd.png";

OutputStream out;
String suffix = null;
Font font = new Font("宋体", Font.BOLD, 54);
Font font1 = new Font("宋体", Font.BOLD, 84);
Font font2 = new Font("宋体", Font.BOLD, 54);


FileInputStream fis = new FileInputStream(relativePath);


Image srcImg = ImageIO.read(fis);

// //文件转化为图片
StringBuilder sb = new StringBuilder();
String companyName = applyComplete.company;
int oyear = Calendar.getInstance().get(Calendar.YEAR);


   

sb.append("经研究,同意")
    .append(companyName.endsWith("公司") ? companyName.substring(0, companyName.length() - 2) : companyName)
    .append("公司推荐")
    .append(applyComplete.currentPosition)
    .append(applyComplete.apply_user)
    .append("认定为:");



if (sb.toString().length() > 28) {
    String s1 = sb.substring(0, 28);
    String s2 = sb.substring(28);


    srcImg = ImgUtil.pressText(srcImg, s1, Color.BLACK, font, 155, -200, 0.9.asFloat());
   
    srcImg = ImgUtil.pressText(srcImg, s2, Color.BLACK, font2, -710 + (26 * s2.length()), -140, 0.9.asFloat());
       
    srcImg = ImgUtil.pressText(srcImg, applyComplete.talent_type.charAt(0) + "-" + applyComplete.startTime + "-" + applyComplete.certificateNo, Color.BLACK, font, 800, -600, 0.9.asFloat());

    srcImg = ImgUtil.pressText(srcImg, applyComplete.talent_type, Color.BLACK, font1, 0, 0, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.certificateDesc, Color.BLACK, font, -110, 100, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedUnit, Color.BLACK, font, 400, 260, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedUnitOffice, Color.BLACK, font, 400, 320, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedDate, Color.BLACK, font, 400, 380, 0.9.asFloat());
} else {
    srcImg = ImgUtil.pressText(srcImg, sb.toString(), Color.BLACK, font, 155, -200, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.talent_type.charAt(0) + "-" +applyComplete.startTime + "-" + applyComplete.certificateNo, Color.BLACK, font, 800, -600, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.talent_type, Color.BLACK, font1, 0, -60, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedUnit, Color.BLACK, font, 400, 260, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedUnitOffice, Color.BLACK, font, 400, 320, 0.9.asFloat());
    srcImg = ImgUtil.pressText(srcImg, applyComplete.signedDate, Color.BLACK, font, 400, 380, 0.9.asFloat());
}


if (relativePath.contains(".")) {
    //获取图片格式后缀
    suffix = relativePath.substring(relativePath.lastIndexOf(".") + 1);
}

//获取图片的宽
int srcImgWidth = srcImg.getWidth(null);
//获取图片的高
int srcImgHeight = srcImg.getHeight(null);
//加水印
BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = bufImg.createGraphics();
//重构图片
graphics.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream imageOutputStream = ImageIO.createImageOutputStream(baos);
ImageIO.write(bufImg, suffix, imageOutputStream);
out = response.getOutputStream();
out.write(baos.toByteArray());
out.flush();
out.close();