Java实现编辑图片并添加文字

最近接了一个需求,需求是给了一张图片,需要向图片当中插入文字,具体文字插入什么根据程序来定,例如下图:

需要对成果名称,完成单位,完成人等进行填充文字。

打开画图工具,然后选择文本

然后我们利用文本框框来测出他的边距,有了边距我们才能定位写文字的位置,宽度1105

高度530

实现出来的代码如下:

@GetMapping("/downImg")
public void downImg(HttpServletResponse response) {
    downloadService.downImg(response);
}

如下代码当中除了IoUtil使用的是hutool的工具类外,其他的均属于Java基础类(不需要引入其他依赖就能使用的)。

public void downImg(HttpServletResponse response) {
    InputStream inputStream = null;
    OutputStream outputStream = null;
    try {
        inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("templates/中医药科技成果登记证书.png");
        Image src = ImageIO.read(inputStream);
        // 获取图片的高和宽
        int wideth = src.getWidth(null);
        int height = src.getHeight(null);
        // 新增一个图片缓冲
        BufferedImage image = new BufferedImage(wideth, height, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.createGraphics();
        g.drawImage(src, 0, 0, wideth, height, null);
        // 设置字体颜色(颜色也可以直接new定义rgba,例如new Color(17, 16, 44))
        g.setColor(Color.BLACK);
        // size字体大小,Font.BOLD字体加粗
        g.setFont(new Font("宋体", Font.BOLD, 50));
        // 写入成果名称,由宽度减去我们测的宽度度,就等于要开始写的位置
        g.drawString("测试测试", wideth - 1105, height - 530);

        // 释放资源
        g.dispose();
        responseSetting(response, "中医药科技", ".png", "image/png");
        outputStream = response.getOutputStream();
        ImageIO.write(image, "png", outputStream);
    } catch (IOException e) {
        throw new RuntimeException(e);
    } finally {
        IoUtil.close(inputStream);
        IoUtil.close(outputStream);
    }
}

这个是一个自己封装的设置response的方法

import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class ServletResponseUtil {

    public static final String EXCEL = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    public static final String ZIP = "application/octet-stream;charset=UTF-8";
    public static final String PDF = "application/pdf;charset=UTF-8";
    public static final String ZIP_SUFFIX = ".zip";
    public static final String EXCEL_SUFFIX = ".xlsx";
    public static final String PDF_SUFFIX = ".pdf";

    /**
     * 设置响应头信息
     *
     * @param response
     * @param fileName    文件名
     * @param suffix      文件后缀
     * @param contentType 文件内容类型
     */
    public static void responseSetting(HttpServletResponse response, String fileName, String suffix, String contentType) {
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String newFileName = null;
        try {
            newFileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            newFileName = fileName;
        }
        // 当客户端请求的资源是一个可下载的资源(这里的“可下载”是指浏览器会弹出下载框或者下载界面)时,对这个可下载资源的描述(例如下载框中的文件名称)就是来源于该头域。
        //response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + newFileName + suffix);
        response.setHeader("Content-disposition", "attachment;filename=''" + newFileName + suffix);
        // 服务器告诉浏览器它发送的数据属于什么文件类型,也就是响应数据的MIME类型
        response.setContentType(contentType);
        response.setCharacterEncoding("utf-8");
        // 关闭缓存(HTTP/1.1)
        response.setHeader("Cache-Control", "no-store");
        // 关闭缓存(HTTP/1.0)
        response.setHeader("Pragma", "no-cache");
        // 缓存有效时间
        response.setDateHeader("Expires", 0);
    }
}

测试:

关于Font类:public Font(String name, int style, int size)

  • name:字体,中文字体名:宋体,楷体,黑体等;英文字体名:Arial,Times New Roman等;
  • style:风格
    • Font.PLAIN (普通)
    • Font.BOLD (加粗)
    • Font.ITALIC (斜体)
    • Font.BOLD+Font.ITALIC(斜体加粗)
  • size:文字大小
  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
你可以使用Java的ImageIO类和Graphics2D类来编辑图片添加水印文字,然后使用File类来保存到指定路径。以下是一个简单的示例代码: ```java import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; public class AddWatermark { public static void main(String[] args) { try { // 读取原始图片 BufferedImage originalImage = ImageIO.read(new File("original.jpg")); // 创建一个新的图片,大小和原始图片一样 BufferedImage newImage = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB); // 在新图片上绘制原始图片 Graphics2D graphics = newImage.createGraphics(); graphics.drawImage(originalImage, 0, 0, null); // 添加水印文字 Font font = new Font("Arial", Font.BOLD, 30); graphics.setFont(font); graphics.setColor(Color.WHITE); graphics.drawString("Watermark Text", 10, 50); // 保存新图片 File output = new File("output.jpg"); ImageIO.write(newImage, "jpg", output); System.out.println("水印添加成功!"); } catch (IOException e) { System.out.println("水印添加失败!"); e.printStackTrace(); } } } ``` 在上面的示例代码中,我们首先使用ImageIO类读取原始图片,然后创建一个新的同样大小的图片,使用Graphics2D类在新图片上绘制原始图片,并添加水印文字。最后使用ImageIO类保存新图片到指定路径。注意修改文件名和路径以适应你的需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值