java 文字生成图片(图片添加文字)

java 给图片添加文字, 或者将文字保存为图片

package test.java;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

// 参考自https://blog.csdn.net/hometing218/article/details/88419874
// 参考自https://www.cnblogs.com/remember-forget/p/8134823.html
public class FontImage {
    public static void main(String[] args) throws Exception {
        createImage("请A1003到3号窗口, 请A1002到2号窗口, 请A1001到1号窗口, 测试测试, 测试2, 测试3\n请A1002到3号窗口\n请A1001到3号窗口", new Font("宋体", Font.PLAIN, 28), new File("d:\\a.png"), new File("D:\\背景图片.png"));
    }

    public static void createImage(String str, Font font, File outFile, File bgImageFile) throws Exception {
        // 读取背景图
        Image bgImage = ImageIO.read(bgImageFile);
        Integer width = bgImage.getWidth(null);
        Integer height = bgImage.getHeight(null);
        // 创建图片
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
        Graphics g = image.getGraphics();
        g.setClip(0, 0, width, height);
        g.drawImage(bgImage, 0, 0, width, height,null);
        g.setColor(Color.black);
        g.setFont(font);
        MyDrawText drawText = new MyDrawText();
        BufferedReader br = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(str.getBytes()), Charset.forName("utf8")));
        String line;
        int locY = g.getFontMetrics().getHeight();
        while (null != (line = br.readLine())) {
            locY = drawText.drawStringWithFontStyleLineFeed(g, line, 0, locY, font, width - g.getFontMetrics().charWidth(' '));
            locY += g.getFontMetrics().getHeight();
        }

        g.dispose();
        // 输出png图片
        ImageIO.write(image, "png", outFile);
    }
}

// 参考自https://www.cnblogs.com/kgdjgd/p/10248977.html
class MyDrawText {
    public int drawStringWithFontStyleLineFeed(Graphics g, String strContent, int locX, int locY, Font font, int rowWidth){
        //获取字符串 字符的总宽度
        int strWidth = getStringLength(g, strContent);
        System.out.println("每行字符宽度:" + rowWidth);
        //获取字符高度
        int strHeight = getStringHeight(g);
        //字符串总个数
        System.out.println("字符串总个数:" + strContent.length());
        if (strWidth > rowWidth) {
            int rowstrnum = getRowStrNum(strContent.length(), rowWidth, strWidth);
            int rows = getRows(strWidth, rowWidth);
            String temp = "";
            for (int i = 0; i < rows; i++) {
                //获取各行的String
                if (i == rows - 1) {
                    //最后一行
                    temp = strContent.substring(i * rowstrnum);
                } else {
                    temp = strContent.substring(i * rowstrnum, i * rowstrnum + rowstrnum);
                }
                if (i > 0) {
                    //第一行不需要增加字符高度,以后的每一行在换行的时候都需要增加字符高度
                    locY = locY + strHeight;
                }
                g.drawString(temp, locX, locY);
            }
        } else {
            //直接绘制
            g.drawString(strContent, locX, locY);
        }

        return locY;
    }

    private int getRows(int strWidth,int rowWidth){
        int rows = 0;
        if (strWidth % rowWidth > 0) {
            rows = strWidth / rowWidth + 1;
        } else {
            rows = strWidth / rowWidth;
        }
        System.out.println("行数:" + rows);
        return rows;
    }

    private int  getStringHeight(Graphics g) {
        int height = g.getFontMetrics().getHeight();
        System.out.println("字符高度:"+height);
        return height;
    }

    private int getRowStrNum(int strnum, int rowWidth, int strWidth){
        int rowstrnum = 0;
        rowstrnum = (rowWidth * strnum) / strWidth;
        System.out.println("每行的字符数:" + rowstrnum);
        return rowstrnum;
    }

    private int  getStringLength(Graphics g,String str) {
        int strWidth = g.getFontMetrics().stringWidth(str);
        System.out.println("字符总宽度:"+strWidth);
        return strWidth;
    }
}

实现功能:

  • 图片中增加文件
  • 多行文字自动按行排列
  • 一行容纳不下的文字,则自动换行

目前还存在一丢丢问题

  • 换行后缩进
  • 有时在换行时会丢掉一个字符,故
    locY = drawText.drawStringWithFontStyleLineFeed(g, line, 0, locY, font, width - g.getFontMetrics().charWidth(' '));

实现效果

背景图片:

合成后图片:

 

使用Linux平台上的Java编程语言实现给图片加上文字水印,将中文文字展示为方框形状的步骤如下: 1. 首先,确保系统环境中已经安装了Java开发工具(JDK)和相关的库文件。 2. 在Java代码中引入相关的图像处理库,例如Java提供的AWT和Java 2D库。 3. 加载待添加水印的图片文件。可以使用Java IO库中的相关类,如ImageIO类,来读取和处理图片文件。 4. 创建一个新的图片对象,以便在其上添加水印。可以使用BufferedImage类来创建一个空白的图片对象,并设置其大小和颜色模式。 5. 根据读取的图片文件,将其内容绘制到新的图片对象中。可以使用Java 2D库中的Graphics类和Graphics2D类来实现这一步骤。 6. 设计一个方框形状的中文水印。可以通过Java的字体相关类(如Font、FontMetrics等)来设置合适的字体样式和字号,并计算文字的宽度和高度。 7. 在新的图片对象的指定坐标位置上绘制方框形状的中文水印。可以使用Java 2D库中的绘图方法,如drawRect()函数绘制方框的边框,fillRect()函数填充方框的内部,以及drawString()函数绘制中文文字。 8. 最后,将新生成的带有水印的图片保存到文件中。可以使用ImageIO类中的write()函数将图片对象保存为指定的格式(如JPEG、PNG等)的文件。 通过以上步骤,就可以在Linux平台上使用Java编程实现给图片加上中文方框水印的功能了。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值