java 用户昵称生成头像

controller 层

    public ResponseEntity<byte[]> getAvatar(@RequestParam String nickname) {
        try {
            byte[] avatarBytes = AvatarGeneratorService.generateAvatar(nickname);

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.IMAGE_PNG);

            return new ResponseEntity<>(avatarBytes, headers, HttpStatus.OK);
        } catch (NoSuchAlgorithmException | IOException e) {
            return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

服务层

public class AvatarGeneratorService {

    public static byte[] generateAvatar(String nickname) throws NoSuchAlgorithmException, IOException {
        // 使用SHA-256算法获取昵称的哈希值
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(nickname.getBytes());

        // 根据哈希值生成颜色
        Color color = new Color(hash[0] & 0xFF, hash[1] & 0xFF, hash[2] & 0xFF);

        // 创建空白图像
        int size = 128; // 图片大小
        BufferedImage image = new BufferedImage(size, size, BufferedImage.TYPE_INT_ARGB);

        // 获取图形对象并绘制背景色
        Graphics2D g = image.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(color);
//        g.fillOval(0, 0, size, size); // 绘制圆形背景
        g.fillRect(0, 0, size, size); // 绘制方形背景

        // 添加昵称首字母
        g.setColor(Color.WHITE);
        Font font = new Font("Arial", Font.BOLD, 48);
        g.setFont(font);
        String letter = nickname.substring(0, 1).toUpperCase();
        FontMetrics metrics = g.getFontMetrics();
        int x = (size - metrics.stringWidth(letter)) / 2;
        int y = ((size - metrics.getHeight()) / 2) + metrics.getAscent();
        g.drawString(letter, x, y);

        g.dispose();

        // 将图像转换为字节数组
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, "png", baos);
        return baos.toByteArray();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值