java:根据用户昵称生成base64头像

生成效果

昵称是诸葛孔明,生成结果如下:
在这里插入图片描述

生成原则

  • 如果用户昵称小于或者等于2个字符,直接生成
  • 如果用户昵称大于2个字符
    • 以中文开头:生成最后两个字
    • 以英文开头:生成大写的首字母
    • 其他情况:生成首字符

pom依赖

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.8</version>
</dependency>

工具类

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

import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 通用头像工具类,生成文字头像
 *
 * @author xuyuxiang
 * @date 2022/7/5 17:36
 **/
public class CommonAvatarUtil {

    /**
     * 绘制字体头像,如果是英文名,只显示首字母大写,
     * 如果是中文名,只显示最后两个字
     * 返回图片base64
     *
     * @author xuyuxiang
     * @date 2022/7/5 17:36
     **/
    public static String generateImg(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 {
                // 截取前面的1个字符,如果是英文,则将首字母大写
                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.PLAIN, 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);
            }
            // 其他
            else {
                g2.drawString(nameWritten, 30, 60);
            }
        }
        // 一个字
        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 ImgUtil.toBase64DataUri(bufferedImage, "jpg");
    }

    /**
     * 获得随机颜色
     *
     * @author xuyuxiang
     * @date 2022/7/5 17:41
     **/
    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]));
    }

    /**
     * 判断字符串是否为中文
     *
     * @author xuyuxiang
     * @date 2022/7/5 17:41
     **/
    private static boolean isChinese(String str) {
        String regEx = "[\\u4e00-\\u9fa5]+";
        Pattern p = Pattern.compile(regEx);
        Matcher m = p.matcher(str);
        return m.find();
    }
}

测试类

public class Test {
    public static void main(String[] args) {
        String img = CommonAvatarUtil.generateImg("诸葛孔明");
        System.out.println(img);
    }
}

测试结果

data:image/jpg;base64,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

结果展示

首先把测试结果填到XXX位置

<img src="XXX" />

然后创建一个以html结尾的文件,并把上述填好的img标签复制到html文件中

在这里插入图片描述

之后以浏览器打开即可

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值