using SkiaSharp; using System.Globalization; using System.IO; using System; namespace JiaZhiQuan.Common.Utils { /// /// 用户昵称生成图片工具类 /// public static class UserAliasGenerateImageUtils { /// /// 绘制用户昵称图片,返回流(!!!流用完自己关) /// /// /// public static Stream Generate(UserAliasGenerateDTO dto) { // 字符串内容 string text = dto.Text; // 当前内容总宽度 float textSumWidth = 0; int maxEmojiWidth = dto.FontSize + 20; using var bitmap = new SKBitmap(dto.Width, dto.Height, SKColorType.Rgba8888, SKAlphaType.Premul); using var canvas = new SKCanvas(bitmap); // 创建绘图笔 using var paint = new SKPaint() { Color = dto.FontColor, TextSize = dto.FontSize, // 抗锯齿 IsAntialias = true, LcdRenderText = false, Style = SKPaintStyle.Fill, FilterQuality = SKFilterQuality.High }; // 文字基于图片定位坐标 float x = 0; float y = paint.TextSize; TextElementEnumerator enumerator = StringInfo.GetTextElementEnumerator(text); while (enumerator.MoveNext()) { string element = enumerator.GetTextElement(); if (string.IsNullOrWhiteSpace(element)) { // 如果是空格,直接计算下一次定位的x坐标即可,不需要绘制 x += paint.MeasureText(element); continue; } // 判断文本元素的类型 if (char.IsLetter(element[0])) { // 处理英文字符 paint.Typeface = SKTypeface.FromFamilyName("Microsoft YaHei"); } else if (char.IsDigit(element[0])) { // 处理数字字符 paint.Typeface = SKTypeface.FromFamilyName("Microsoft YaHei"); } else if (char.IsPunctuation(element[0])) { // 处理符号字符 paint.Typeface = SKTypeface.FromFamilyName("Microsoft YaHei"); } else { // 处理其他字符(如中文字符和 Emoji) if (CheckStringChineseUn(element)) { paint.Typeface = SKTypeface.FromFamilyName("Microsoft YaHei"); } else { paint.Typeface = SKTypeface.FromFamilyName("Segoe UI Emoji"); } } // 计算字符的宽度 float charWidth = paint.MeasureText(element) > maxEmojiWidth ? maxEmojiWidth : paint.MeasureText(element); textSumWidth += charWidth; // 判断当前是否超过最大宽度 if (textSumWidth >= dto.MaxWidth) { // 多余的字符用省略号代替 canvas.DrawText("...", x, y, paint); break; } // 绘制字符 canvas.DrawText(element, x, y, paint); // 调整下一个字符的位置 x += charWidth + dto.FontLeftMargin; } // 保存图像到文件 using var image = SKImage.FromBitmap(bitmap); using var data = image.Encode(SKEncodedImageFormat.Png, 100); // 流不关闭,需要在外部关闭 var stream = new MemoryStream(); data.SaveTo(stream); // 替换为要保存的文件路径 //string filePath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location), "yug_test.png"); //using (FileStream fileStream = new FileStream(filePath, FileMode.Create)) //{ // // 将 MemoryStream 中的数据写入到文件流 // stream.WriteTo(fileStream); //} return stream; } /// /// 检查字符串是否包含中文 /// /// /// public static bool CheckStringChineseUn(string text) { bool res = false; foreach (char t in text) { if (t >= 0x4e00 && t <= 0x9fff) { res = true; break; } } return res; } } public class UserAliasGenerateDTO { /// /// 内容区域最大宽度 /// public int MaxWidth { get; set; } /// /// 图片宽度 /// public int Width { get; set; } /// /// 图片宽度 /// public int Height { get; set; } /// /// 内容 /// public string Text { get; set; } /// /// 字体大小 /// public int FontSize { get; set; } /// /// 字体颜色 /// public SKColor FontColor { get; set; } /// /// 文字左边距 /// public int FontLeftMargin { get; set; } = 2; } }