Java生成base64文字图

Java生成base64文字图

什么是文字图

文字图是一种特别小的图片,图片内容是1-2个文字,常用来做默认头像默认Logo之类的图片。
前端展示文字图,可以直接用img标签的base64图片功能来展示,也可以要求后端提供存好的图片的url,
由于文字图非常小,建议直接给前端提供文字图的base64字符串,为后端节省存储压力

Java生成文字图的自定义工具类

package cn.ath.knowwikibackend.util;


import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class AvatarBuildUtil {

    /**
     * 获取1个随机的rgb颜色,转为java.awtColor
     * @return Color
     */
    private static Color getRandomColor() {
        String[] beautifulColors =
                new String[]{"114,101,230", "255,191,0", "0,162,174", "245,106,0", "24,144,255", "96,109,128"};
        String[] color = beautifulColors[RandomUtil.randomInt(beautifulColors.length)].split(StrUtil.COMMA);
        return new Color(Integer.parseInt(color[0]), Integer.parseInt(color[1]),
                Integer.parseInt(color[2]));
    }


    /**
     * 判断输入的是不是中文名
     * @param str String
     * @return boolean
     */
    private static boolean isChinese(String str) {
        String regEx = "[\\u4e00-\\u9fa5]+";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }

    /**
     * 用BufferedImage构建文字图
     * @param name String
     * @return BufferedImage
     */
    private static BufferedImage generateWZTBufferedImage(String name){
        int width = 100;
        int height = 100;
        int nameLength = name.length();
        String nameWritten;
        // 如果用户输入的姓名少于等于2个字符,不用截取
        if (nameLength <= 2) {
            nameWritten = name;
        } else {
            // 如果用户输入的姓名大于等于3个字符,截取后面两位
            String first = StrUtil.sub(name, 0, 1);
            if (isChinese(first)) {
                // 截取倒数两位汉字
                nameWritten = name.substring(nameLength - 2);
            } else {
                // 截取前面的两个英文字母
                nameWritten = StrUtil.sub(name, 0, 1).toUpperCase();
            }
        }
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) bufferedImage.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setBackground(getRandomColor());
        g2.clearRect(0, 0, width, height);
        g2.setPaint(Color.WHITE);
        Font font;
        // 两个字及以上
        if(nameWritten.length() >= 2) {
            font = new Font("微软雅黑", Font.BOLD, 30);
            g2.setFont(font);
            String firstWritten = StrUtil.sub(nameWritten, 0, 1);
            String secondWritten = StrUtil.sub(nameWritten, 0, 2);
            // 两个中文 如 言曌
            if (isChinese(firstWritten) && isChinese(secondWritten)) {
                g2.drawString(nameWritten, 20, 60);
            }
            // 首中次英 如 罗Q
            else if (isChinese(firstWritten) && !isChinese(secondWritten)) {
                g2.drawString(nameWritten, 27, 60);
                // 首英 如 AB
            } else {
                nameWritten = nameWritten.substring(0,1);
            }
        }
        // 一个字
        if(nameWritten.length() == 1) {
            // 中文
            if(isChinese(nameWritten)) {
                font = new Font("微软雅黑", Font.PLAIN, 50);
                g2.setFont(font);
                g2.drawString(nameWritten, 25, 70);
            } else {
                font = new Font("微软雅黑", Font.PLAIN, 55);
                g2.setFont(font);
                g2.drawString(nameWritten.toUpperCase(), 33, 67);
            }
        }
        return bufferedImage;
    }

    /**
     * 根据 name 生成 base64 形式的 文字图
     * @param name String
     * @return String
     */
    public static String generateWZTImgBase64(String name) {
        BufferedImage bufferedImage = generateWZTBufferedImage(name);
        //使用hutool提供的工具 把BufferedImage 转为 base64 字符串
        return ImgUtil.toBase64DataUri(bufferedImage, "jpg");
    }

    /**
     * 根据 name 生成 File 形式的 文字图
     * @param name String
     * @return File
     */
    public static File generateWZTImgTempFile(String name){
        BufferedImage bufferedImage = generateWZTBufferedImage(name);
        //创建1个空白的临时文件 xxxx.jpg
        String tmpDirPath = FileUtil.getTmpDirPath();
        File tempFile = new File(tmpDirPath
                + "/" + System.currentTimeMillis() + ".jpg");
        try {
            //用ImageIO工具类把 BufferedImage 以jpg格式 写入 File
            ImageIO.write(bufferedImage,"jpg",tempFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return tempFile;
    }
}

测试效果

@Test
    void testWenZiTu() {
        //生成base64文字图
        String base64 = AvatarBuildUtil.generateWZTImgBase64("张飞");
        System.out.println(base64);
        
        //生成一个临时file,返回file的绝对路径
        File file = AvatarBuildUtil.generateWZTImgTempFile("琳琅天");
        System.out.println(file.getAbsolutePath());
    }    
data:image/jpg;base64,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
C:\Users\ADMINI~1\AppData\Local\Temp\1686130217116.jpg

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThinkPet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值