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