# 这是什么

ImageSharp 为 C# 第三方绘图库,在.net core 时代开创了跨平台之后,gdi + 作为仅能在 Windows 平台使用的绘图库,失去了广泛性,为了跨平台,绘图需要使用一个第三库。

# 特性

  • 跨平台
  • 能够读取绘制大部分图片格式
  • 暂不支持 Webp 的动图格式
  • 相较于 GDI + 而言,占用内存更多、绘制速度更慢
  • 特殊字符绘制会出现问题,需要独立处理特殊 Unicode 或者 Emoji 字符
  • 提供自动换行的文本绘制方法

# 代码示例

# 新建空白画布

1
2
using Image<Rgba32> background = new(width, height, Color.White);
// 参数分别为 宽度、高度以及默认背景色

# 从文件读取图片

1
Image img = Image.Load(path);

# 使用 rgb 新建颜色

1
2
Color color = new Rgba32(244, 245, 247, 255);
// 四个参数分别为R、G、B、A

# 使用 16 进制文本创建颜色

1
Color color = Color.ParseHex("#66ccff");

# 变更图片大小、裁剪

1
2
3
4
5
6
7
using Image<Rgba32> img = new(width, height, Color.White);
Size size = new(48);
// 长宽均为48像素
img.Mutate(x => x.Resize(size));
// 修改图片尺寸
img.Mutate(x => x.Crop(width, height);
// 从左上角开始 按照指定尺寸裁剪图片

# 定义形状、填充颜色

1
2
3
4
5
6
7
8
IPath container = new RectangularPolygon(X, Y, width, height);
// 首先定义需要填充的形状,这里定义了一个矩形,参数为 左上角X、左上角Y、矩形宽度、矩形高度
// IPath circle = new EllipsePolygon(x, y, r);
// 定义了一个正圆,参数为 左上角X、左上角Y、半径
// IPath ellipse = new EllipsePolygon(x, y, width, height);
// 定义了一个椭圆,参数为 左上角X、左上角Y、椭圆宽度、椭圆高度
// 此外还有多边形的定义,可用上述的形状进行拼接
img.Fill(new Rgba32(244, 245, 247), container);

# 绘制圆形图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
using Image<Rgba32> background = new(width, height, Color.White);
Size avatarSize = new(48);
using Image avatar = Image.Load("sample path");
// 读取图片
avatar.Mutate(x => x.Resize(avatarSize));
// 将图片修改为指定的尺寸
using Image<Rgba32> avatarFrame = new(48, 48, new Rgba32(255, 255, 255, 0));
// 新建透明图片底片
IPath circle = new EllipsePolygon(avatarFrame.Width / 2, avatarFrame.Height / 2, avatarFrame.Width / 2);
// 定义圆形形状,之后将图片涂在这个形状内
avatarFrame.Mutate(x => x.Fill(new ImageBrush(avatar), circle));
// 使用ImageBrush将图片按形状绘制在透明底片中
background.Mutate(x => x.DrawImage(avatarFrame, new Point(14, 14), 1));
// 将透明底片绘制在背景中

# 将图片绘制在另一张图片中

1
2
3
background.Mutate(x => x.DrawImage(avatarFrame, new Point(14, 14), 1));
// DrawImage函数的参数分别为 需要绘制的图片、绘制的位置、透明度
// 需要指定图片尺寸的时候,可以在这一行之前创建图片拷贝、之后按照上面提到的方法对尺寸进行修改

# 自定义绘制流程函数

1
2
3
4
5
6
7
private IImageProcessingContext RenderRichText(Item item, IImageProcessingContext img)
{
// 处理逻辑
return img;
}
background.Mutate(x => RenderRichText(item, x));
// 这样便将绘制上下文传输给了函数,并在处理完成之后进行了同步

# 文本绘制、文本长度高度测量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Font bigFont = SystemFonts.CreateFont("Microsoft YaHei", 20);
// 首先定义字体,参数为 字体名称、字体大小
TextOptions option = new TextOptions(bigFont)
{
TextAlignment = TextAlignment.Start,
VerticalAlignment = VerticalAlignment.Center,
WrappingLength = 100,
Origin = new Point(10, 10)
};
// 之后需要定义文本绘制要求,参数为 文本方向、垂直对齐、换行最大宽度、初始绘制坐标
Info.Mutate(x=>x.DrawText(Name, smallFont, Color.Black));
// 进行文本绘制
var size = TextMeasurer.Measure(Name, option);
// 可以测量文本绘制所占的大小