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();
}
}