Java实现根据姓名生成头像(钉钉样式)

头像生成器代码如下:

java 复制代码
package com.hua.util;

import org.apache.commons.lang3.StringUtils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
import java.util.UUID;

/**
 * @author: zhengzhonghua
 * @date: 2023/3/16 13:23
 * @description: 头像生成器
 */
public class HeadGeneration {
    /**
     * @author: zhengzhonghua
     * @date: 2023/3/16 13:24
     * @description: 头像生成
     * @param name 用户名称
     * @return 访问图片的路径 localhost:8082/img/
     */
    public static String generateImg(String name) throws IOException {
        int nameLen = name.length();
        //定义最后在图片上显示的姓名
        String nameWritten;
        if (nameLen <= 2) {
            nameWritten = name;
        } else {
            //如果用户姓名大于三位,截取后两位
            nameWritten = StringUtils.right(name, 2);
        }
        String uuid = UUID.randomUUID().toString().replace("-","");
        //文件名(路径+uuid+.jpg)
        String fileName = Const.HEAD_IMAGE_URL + uuid+".jpg";
        File file = new File(fileName);
        //生成图片
        BufferedImage bi = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = (Graphics2D) bi.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
        g2.setBackground(getRandomColor());
        g2.clearRect(0, 0, 100, 100);
        g2.setPaint(Color.WHITE);
        Font font = null;
        // 两个字及以上
        if (nameWritten.length() >= 2) {
            font = new Font("微软雅黑", Font.PLAIN, 30);
            g2.setFont(font);
            g2.drawString(nameWritten, 20, 60);
        }
        // 一个字
        if (nameWritten.length() == 1) {
            // 中文
            font = new Font("微软雅黑", Font.PLAIN, 50);
            g2.setFont(font);
            g2.drawString(nameWritten, 25, 70);

        }
        //图片做圆角处理
        BufferedImage rounded = makeRoundedCorner(bi, Const.HEAD_IMAGE_Radius);
        ImageIO.write(rounded, "png", file);
        return Const.serverUrl+uuid+".jpg";
    }

    /**
     * @author: zhengzhonghua
     * @date: 2023/3/16 13:32
     * @description: 生成随机颜色
     */
    private static Color getRandomColor() {
        String[] beautifulColors = new String[]{"2,168,250"};
        int len = beautifulColors.length;
        Random random = new Random();
        String[] color = beautifulColors[random.nextInt(len)].split(",");
        return new Color(Integer.parseInt(color[0]), Integer.parseInt(color[1]), Integer.parseInt(color[2]));
    }

    /**
     * @author: zhengzhonghua
     * @date: 2023/3/16 13:39
     * @description: 图片做圆角处理
     */
    public static BufferedImage makeRoundedCorner(BufferedImage image, int cornerRadius) {
        int w = image.getWidth();
        int h = image.getHeight();
        BufferedImage output = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g2 = output.createGraphics();
        g2.setComposite(AlphaComposite.Src);
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.WHITE);
        g2.fill(new RoundRectangle2D.Float(0, 0, w, h, cornerRadius, cornerRadius));
        g2.setComposite(AlphaComposite.SrcAtop);
        g2.drawImage(image, 0, 0, null);
        g2.dispose();
        return output;
    }

}
相关推荐
okseekw1 分钟前
Maven从入门到实战:核心概念+配置详解+避坑指南
java·后端
tryxr4 分钟前
ReentrantLock 与 synchronized 的区别
java··reentrantlock
Java爱好狂.32 分钟前
Java面试Redis核心知识点整理!
java·数据库·redis·分布式锁·java面试·后端开发·java八股文
sheji341642 分钟前
【开题答辩全过程】以 基于Java的应急安全学习平台的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
程序员小假1 小时前
我们来说一下消息的可靠性投递
java·后端
席之郎小果冻1 小时前
【04】【创建型】【聊一聊,建造者模式】
java·前端·建造者模式
原来是好奇心1 小时前
深入Spring Boot源码(四):Starter机制与依赖管理深度解析
java·源码·springboot·starter
阿杆1 小时前
如何在 Spring Boot 中接入 Amazon ElastiCache
java·数据库·redis
cheems95271 小时前
锁策略的介绍
java·开发语言