java 将 text 文字、文本 内容 转为 图片

java 将 text 文字、文本 内容 转为 图片

参考了大神的代码,大神的分割算法很精妙,将大神的代码进行了优化,做个留存
大神博客地址:https://xunming.blog.csdn.net/article/details/91956952

更改后的功能:
1.将长文本生成长图片,不会进行分割
2.根据文本内容自动计算图片的高度,图片的宽度默认是960,每一行的高度默认是24
3.生成图片 宽度会多20px(以防最后一个字显示不全),高度会多一行(即多24px)

package com.example.demo.util;

import sun.font.FontDesignMetrics;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import javax.imageio.ImageIO;

/**
 * 如果一行文字长度超过了既定的宽度,那么主动执行换行操作
 */
public class TextToImage {

    /**
     * 图片宽度
     */
    private static int width = 960;
    /**
     * 每一行的高度
     */
    private static int line_height = 24;
    /**
     * 字体
     */
    private static Font font = new Font("宋体", Font.PLAIN, 14);

    public static void main(String[] args) throws Exception {
        String message = "这里输入你的文本,或者从文件系统中去读";
        String[] strArr = message.split("\n");

        createImage(strArr);

    }

    public static void createImage(String[] strArr) throws Exception {


        FontMetrics fm = FontDesignMetrics.getMetrics(font);
        int stringWidth = fm.charWidth('字');// 标点符号也算一个字
        //计算每行多少字 = 宽/每个字占用的宽度
        int line_string_num = width % stringWidth == 0 ? (width / stringWidth) : (width / stringWidth) + 1;

        System.out.println("每行字数=" + line_string_num);
        //将数组转为list
        List<String> strList = new ArrayList<>(Arrays.asList(strArr));

        //按照每行多少个字进行分割
        for (int j = 0; j < strList.size(); j++) {
            //当字数超过限制,就进行分割
            if (strList.get(j).length() > line_string_num) {
                //将多的那一端放入本行下一行,等待下一个循环处理
                strList.add(j + 1, strList.get(j).substring(line_string_num));
                //更新本行的内容
                strList.set(j, strList.get(j).substring(0, line_string_num));
            }
        }

        //计算图片的高度,多预留一行
        int image_height = strList.size() * line_height + line_height;

        //每张图片有多少行文字
        int every_line = image_height / line_height;


        for (int m = 0; m < 1; m++) {
            String filePath = "E:\\新建文件夹\\" + m + ".jpg";
            File outFile = new File(filePath);
            // 创建图片  宽度多预留一点
            BufferedImage image = new BufferedImage(width + 20, image_height,
                    BufferedImage.TYPE_INT_BGR);
            Graphics g = image.getGraphics();
            g.setClip(0, 0, width + 20, image_height);
            g.setColor(Color.white); // 背景色白色
            g.fillRect(0, 0, width + 20, image_height);

            g.setColor(Color.black);//  字体颜色黑色
            g.setFont(font);// 设置画笔字体

            // 每张多少行,当到最后一张时判断是否填充满
            for (int i = 0; i < every_line; i++) {
                int index = i + m * every_line;
                if (strList.size() - 1 >= index) {
//                    System.out.println("每行实际=" + newList.get(index).length());
                    g.drawString(strList.get(index), 0, line_height * (i + 1));
                }
            }
            g.dispose();
            ImageIO.write(image, "jpg", outFile);// 输出png图片
        }
    }

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值