Java给图片添加文字,水印,文件或者http图片地址,可消除文字锯齿

该博客介绍了一种使用Java给图片添加水印的方法,并能将处理后的图片转换为Base64编码。通过创建一个ImageDTO类来封装水印信息,包括文字、颜色、字体等,然后利用Graphics2D进行绘制。示例代码展示了如何处理HTTP地址的图片,同时也提供了处理本地文件的注释。最后,给出了使用示例,添加多个水印到图片并在完成操作后将图片转为Base64字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记一次Java给图片添加水印方法

Java给图片在指定位置加水印的小工具, 可操作文件, 或者http地址图片,转base64或者直接输出都可

核心代码先贴出来

水印基本信息的一个封装

import lombok.AllArgsConstructor;
import lombok.Data;

import java.awt.*;

/**
 * @author maple
 */
@Data
@AllArgsConstructor
public class ImageDTO {
    /**
     * 文字内容
     */
    private String text;

    /**
     * 字体颜色和透明度
     */
    private Color color;

    /**
     * 文字内容
     */
    private Font font;

    /**
     * 横坐标
     */
    private Integer x;

    /**
     * 纵坐标
     */
    private Integer y;

}

核心操作工具

我的需求是拿到一个图片http地址, 往指定位置加文字, 再转成base64返回给前端
如果是File文件的,请看注释

/**
     * @param imageUrl 源图片路径
     * @param list     水印信息, list是可以再图片上加多次文字
     * @return base64
     */
    private String writeImage(String imageUrl, List<ImageDTO> list) {
        try {
            InputStream inputStream = new DataInputStream(new URL(imageUrl).openStream());
            //获取原图片信息  文件转化为图片
            Image srcImg = ImageIO.read(inputStream);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);

            //添加文字:
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            Graphics2D g = bufImg.createGraphics();
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            for (ImageDTO imgDTO : list) {
                //根据图片的背景设置水印颜色
                g.setColor(imgDTO.getColor());
                //设置字体
                g.setFont(imgDTO.getFont());
                // 消除锯齿 --- 这个真的是关键了
                g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
                //画出水印
                g.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY());
            }
            g.dispose();
			// 下面是转base64
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            ImageIO.write(bufImg, "png", outputStream);
            BASE64Encoder encoder = new BASE64Encoder();

			// 如果要输出图片
            // outImgStream = new FileOutputStream(targetImgPath);
            // ImageIO.write(bufImg, "jpg", outImgStream);

            return "data:image/jpg;base64," + encoder.encodeBuffer(outputStream.toByteArray()).trim().replaceAll("\n", "").replaceAll("\r", "");
        } catch (Exception e) {
            log.error("==== 系统异常::{} ====", e.getMessage());
            throw new RuntimeException(e);
        }
    }
  • 如果是具体的文件路径, 将转图片的方式稍作改变即可
	 * 此处的imgPath是一个具体的位置 比如说 /Users/xxx/Desktop/test.png
	 * File img = new File(imgPath)
	 * Image image = ImageIO.read(img);

最终使用方式

public static void main(String[] args) {
        
        List<ImageDTO> dtoList = new ArrayList<>();
        // text1
        dtoList.add(new ImageDTO("水印文字1", new Color(234, 109, 128),
                new Font("宋体", Font.BOLD, 39),
                105,
                138));
        // text2
        dtoList.add(new ImageDTO("水印文字2", new Color(234, 109, 128),
                new Font(宋体, Font.BOLD, 52),
                450,
                230));
        // text3
        dtoList.add(new ImageDTO("水印文字3", new Color(235, 113, 133),
                new Font(宋体, Font.BOLD, 22),
                80,
                615));

        String base64 = writeImage("https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png", dtoList);
        // 文件路径方式
        // String base64 = writeImage("/Users/xxx/Desktop/rs7.jpeg", dtoList);
    }

重点参数解读

  • Font(“字体”, 字体类型, 字体大小(磅))
    字体类型取值
    Font.PLAIN(普通)
    Font.BOLD(加粗)
    Font.ITALIC(斜体)
    Font.BOLD+ Font.ITALIC(粗斜体)
  • Color(r, g, b) rgb不多说了吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值