Java-编辑图片,添加文字

二话不说,直接上代码, 具体注释, 代码里简单的有写: 可以根据我后面给的两张效果图进行测试;

demo测试方法: 直接将如下代码复制到一个java文件中运行main方法即可;

注意: 代码中标记'todo'的地方自行修改;

import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @use 利用Java代码给图片添加文字(透明图调低点,也可以当做水印)
 */
@Slf4j
public class WaterMarkUtils {
    /**
     * 编辑图片,往指定位置添加文字
     * @param srcImgPath    :源图片路径
     * @param targetImgPath :保存图片路径
     * @param list          :文字集合
     */
    public static void writeImage(String srcImgPath, String targetImgPath, List<ImageDTO> list) {
        FileOutputStream outImgStream = null;
        try {
            //读取原图片信息
            File srcImgFile = new File(srcImgPath);//得到文件
            Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
            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.drawString(imgDTO.getText(), imgDTO.getX(), imgDTO.getY());   //画出水印
            }
            g.dispose();

            // 输出图片
            outImgStream = new FileOutputStream(targetImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
        } catch (Exception e) {
            log.error("==== 系统异常::{} ====",e);
        }finally {
            try {
                if (null != outImgStream){
                    outImgStream.flush();
                    outImgStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 创建ImageDTO, 每一个对象,代表在该图片中要插入的一段文字内容:
     * @param text  : 文本内容;
     * @param color : 字体颜色(前三位)和透明度(第4位,值越小,越透明);
     * @param font  : 字体的样式和字体大小;
     * @param x     : 当前字体在该图片位置的横坐标;
     * @param y     : 当前字体在该图片位置的纵坐标;
     * @return
     */
    private static ImageDTO createImageDTO(String text,Color color,Font font,int x,int y){
        ImageDTO imageDTO = new ImageDTO();
        imageDTO.setText(text);
        imageDTO.setColor(color);
        imageDTO.setFont(font);
        imageDTO.setX(x);
        imageDTO.setY(y);
        return imageDTO;
    }


    /**
     * main方法:
     * @param args
     */
    public static void main(String[] args) {

        //=========================================自行发挥================================
        //todo 自己真实的地址:(如果项目中使用的阿里云,则自行改造'writeImage'方法,接受流对象就好了);
        String srcImgPath="C:\\Users\\mm\\Desktop\\test.png";    //源图片地址
        String tarImgPath="C:\\Users\\mm\\Desktop\\test1.png";   //目标图片的地址
        //==============================================================================

        //获取数据集合;
        ArrayList<ImageDTO> list = new ArrayList<>();
        list.add(createImageDTO("2020/02/02/15:30:30",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 78, 160));
        list.add(createImageDTO("账户名称",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 178, 226));
        list.add(createImageDTO("1111111",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 710, 226));
        list.add(createImageDTO("上海银行",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 178, 290));
        list.add(createImageDTO("这是用途",new Color(102,102,102,100),new Font("微软雅黑", Font.PLAIN, 24), 710, 290));
        list.add(createImageDTO("¥50.00",new Color(255,59,48),new Font("微软雅黑", Font.PLAIN, 36), 270, 366));

        //操作图片:
        WaterMarkUtils.writeImage(srcImgPath, tarImgPath, list);

        //这句代码,自己项目中可以不用加,在这里防止main方法报错的;
        System.exit(0);
    }
}


/**
 * 存放文本内容的类
 */
@Setter
@Getter
class ImageDTO{
    //文字内容
    private String text;
    //字体颜色和透明度
    private Color color;
    //字体和大小
    private Font font;
    //所在图片的x坐标
    private int x;
    //所在图片的y坐标
    private int y;
}

执行前的效果:

 执行后的效果:

  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值