using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.Versioning;
namespace HaloPixelToolBox.Backend.Utilities;
[SupportedOSPlatform("windows")]
public static class AvatarGenerator
{
///
/// 根据中文姓氏生成头像图片(白字 + 随机深色背景)
///
/// 中文姓氏
/// 头像边长(像素)
/// Bitmap 对象
public static Bitmap CreateAvatar(string surname, int size = 128)
{
if (string.IsNullOrWhiteSpace(surname))
surname = "?";
var initial = surname.Trim()[0].ToString();
var bg = ColorFromName(initial);
if (!IsDarkEnough(bg))
bg = Darken(bg, 0.3);
var bmp = new Bitmap(size, size);
using var g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
g.Clear(Color.Transparent);
using (var brush = new SolidBrush(bg))
{
g.FillEllipse(brush, 0, 0, size, size);
}
var fontSize = size * 0.45f;
using var font = new Font("Microsoft YaHei", fontSize, FontStyle.Bold, GraphicsUnit.Pixel);
using var sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
using var textBrush = new SolidBrush(Color.White);
var rect = new Rectangle(0, 0, size, size);
g.DrawString(initial, font, textBrush, rect, sf);
return bmp;
}
private static Color ColorFromName(string name)
{
var hash = name.GetHashCode();
var rnd = new Random(hash);
return Color.FromArgb(255,
rnd.Next(64, 192),
rnd.Next(64, 192),
rnd.Next(64, 192));
}
private static bool IsDarkEnough(Color c)
{
var lum = (0.2126 * c.R + 0.7152 * c.G + 0.0722 * c.B) / 255.0;
return lum < 0.6;
}
private static Color Darken(Color c, double factor)
{
return Color.FromArgb(c.A,
(int)(c.R * (1 - factor)),
(int)(c.G * (1 - factor)),
(int)(c.B * (1 - factor)));
}
}