Document

Net Core通过GDI+在CentOS 7(Docker)环境中绘图报错The type initializer for 'Gdip' threw an exception的问题及处理方式

1. 报错的原因以及场景
自己买了台阿里云服务器,想着做一个网站,但是首页登录需要使用Bitmap类型与Graphics 绘制验证码,
在Windows下面是没有什么问题的,但是到阿里云的CentOS7.5的一直报错
“The type initializer for 'Gdip' threw an exception”,
无奈只能用输出命令行窗口的笨方法开始排查。

{
Console.WriteLine("错误原因1");
Random random = new Random();
//验证码颜色集合
Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
//验证码字体集合
string[] fonts = { "Small Fonts", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "Kristen ITC", "方正舒体", "Tempus Sans ITC", "Segoe Script", "Papyrus" };
Console.WriteLine("错误原因2");
using var img = new Bitmap((int)code.Length * 18, 34);
using var g = Graphics.FromImage(img);
Console.WriteLine("错误原因3");
g.Clear(Color.Wheat);//背景
Console.WriteLine("错误原因4");
//在随机位置画背景点
for (int i = 0; i < 80; i++)
{
int x = random.Next(img.Width);
int y = random.Next(img.Height);
g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 4, 4);
}
//验证码绘制在g中
for (int i = 0; i < code.Length; i++)
{
int cindex = random.Next(7);//随机颜色索引值
int findex = random.Next(8);//随机字体索引值
Font f = new Font(fonts[findex], 17, FontStyle.Bold);//字体
Brush b = new SolidBrush(c[cindex]);//颜色
int ii = 4;
if ((i + 1) % 3 == 0)//控制验证码不在同一高度
{
ii = 3;
}
g.DrawString(code.Substring(i, 1), f, b, 3 + (i * 12), ii);//绘制一个验证字符
}
using (MemoryStream stream = new MemoryStream())
{
img.Save(stream, ImageFormat.Jpeg);
byte[] b = stream.ToArray();
return Convert.ToBase64String(stream.ToArray());
}
}

根据逐步的排查再加上无数次的百度,得出在Linux系统上,是没有Image类似的包绘制dll

using System.Drawing;
using System.Drawing.Imaging;
2.解决方式
由于我是基于Docker 容器化部署的,所以就要开始下载这个依赖,先进入这个容器里面。

docker exec -it 容器名字 /bin/bash 进入到容器里面
apt-get update -y 更新这个容器里面的 apt-get 应用管理程序
apt-get install -y libgdiplus 安装libgdiplus
ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll 创建符号链接
exit 退出容器
docker restart 容器名字 重启容器

注:容器名字就是你得部署的netcore 程序

这个时候我们已经下载了这个相关的依赖,下载的时候一定要有耐心,因为我当时下载了20分钟左右,因为是境外的网站,访问速度慢的令人发指。。。。。
这样验证码绘画报错的原因就已经解决了。,再次访问就没有什么问题了

4.结语
自此已经完美解决了,我也是参考依赖了很多文章,才得以解决的。欢迎各位有更好的方法,留言讨论!!!

posted @ 2022-04-01 14:48  从未被超越  阅读(282)  评论(0)    收藏  举报