使用 Java 将文字生成图片

  1. Text2ImageUtil

通常用在用户的文字头像生成,比如钉钉。需要添加如下依赖:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.12</version>
    <scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.4</version>
</dependency>

Text2ImageUtil

package com.shar.pdf;

import lombok.Builder;
import lombok.Data;
import org.apache.commons.io.FileUtils;
import sun.font.FontDesignMetrics;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Date;

public class Text2ImageUtil {

    public static void main(String[] args) throws IOException {
        String text = "张三";
        String formatName = "png";
        Color backgroundColor = Color.orange;
        int width = text.length()*20;
        int height = 30;
        TextDto textDto = TextDto.builder().text(text).formatName(formatName).backgroudColor(backgroundColor).build();
        InputStream inputStream = Text2ImageUtil.create(textDto, width, height);
        File targetFile = new File(new Date().getTime()+"."+formatName);
        FileUtils.copyInputStreamToFile(inputStream, targetFile);
    }

    @Data
    @Builder
    public static class TextDto {
        String text;
        String formatName;//目标图片是什么后缀,png\jpg
        Font font;
        Color backgroudColor;
        Color textColor;
    }

    /**
     * 创建头像
     * @param width  图片宽度
     * @param height 图片高度
     * @return
     */
    public static InputStream create(TextDto textDto, int width, int height){
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {

            BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

            Graphics2D g = (Graphics2D) buffImg.getGraphics();
            //消除文字锯齿
            g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
            //消除画图锯齿
            g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,RenderingHints.VALUE_STROKE_DEFAULT);
            buffImg = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
            g.dispose();
            g = buffImg.createGraphics();
            // 图片背景色
            g.setColor(textDto.getBackgroudColor()==null?Color.white:textDto.getBackgroudColor());
            g.fillRect(0, 0, width, height);
            // 创建字体,字体的大小应该根据图片的高度来定。
            Font font = textDto.getFont()==null?new Font("宋体", Font.PLAIN, 14):textDto.getFont();
            //字体的大小信息
            FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);
            //文字宽
            int fontWidth = metrics.stringWidth(textDto.getText());
            //文字的高
            int fontHeight = metrics.getHeight();
            //基线(baseline)到该字体中大多数字符的升部(ascender)之间的距离
            int ascent = metrics.getAscent();
            g.setFont(font);
            g.setColor(textDto.getTextColor()==null?Color.black:textDto.getTextColor());

            //drawString的坐标指的是文字左下角的坐标
            g.drawString(textDto.getText(), width/2-fontWidth/2, height/2-fontHeight/2+ascent);
            ImageIO.write(buffImg, textDto.getFormatName(), os);
            InputStream inputStream = new ByteArrayInputStream(os.toByteArray());
            return inputStream;
        } catch (Exception e) {
            System.out.println("生成头像异常,e={}");
        }finally {
            try {
                os.close();
            } catch (IOException e) {
                System.out.println("os流关闭异常");
            }
        }
        return null;
    }
}

转载请注明来源。 欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。 可以在下面评论区评论,也可以邮件至 sharlot2050@foxmail.com。

文章标题:使用 Java 将文字生成图片

字数:536

本文作者:夏来风

发布时间:2021-04-28, 23:41:13

原始链接:http://www.demo1024.com/blog/java-text-2-image/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。