https://pkgs.org/download/libfontconfig1
System.TypeInitializationException: The type initializer for ‘SkiaSharp.SKImageInfo’ threw an exception.
—> System.DllNotFoundException: Unable to load shared library ‘libSkiaSharp’ or one of its dependencies. In order to help diagnose loading problems, consider using a tool like strace. If you’re using glibc, consider setting the LD_DEBUG environment variable:
图片验证码
https://github.com/SixLabors/ImageSharp
https://www.jianshu.com/p/0f2b51130e65
https://www.cnblogs.com/yuangang/p/6000460.html
https://www.yii666.com/blog/172242.html
https://github.com/mono/SkiaSharp/blob/main/LICENSE.md
https://blog.csdn.net/qq_43206871/article/details/130558130
https://blog.csdn.net/mzl87/article/details/127353397
https://pkgs.org/download/libfontconfig1
项目如果是在 windows 服务器下运行则不需要任何安装任何依赖项,如果是在 linux 服务下运行则需要安装 libfontconfig1,如 ubuntu 的安装命令
apt-get update
apt-get -y install libfontconfig1
如果是采用 docker 模式运行,则需要在 dockerfile 中添加如下配置,该命令适用于 debian 和 ubuntu 的 docker
RUN apt-get update && apt-get -y install libfontconfig1
https://altlinux.pkgs.org/p10/classic-aarch64/libfontconfig1-2.14.2-alt6.aarch64.rpm.html
拷贝下载好的离线安装包到无网络的机器后执行下列命令
rpm -Uvh *.rpm --nodeps --force
确认是否安装成功
yum list installed | grep "libfontconfig1"
ImageSharp 案例
https://github.com/SixLabors/ImageSharp
https://www.jianshu.com/p/0f2b51130e65
三.画验证码(点我查看源码)
在使用ImageSharp之前,已经有基于Zkweb.system.drawing的.netcore跨平台验证码方案,为了很好的做对比,这里参考http://www.cnblogs.com/yuangang/p/6000460.html
1.生成画布或者在其他图片上画
using (image = new Image(400, 400))
using (FileStream streamTemple = System.IO.File.OpenRead(someImg))
using (var pixels = image.Lock())
{
}
2.绘制遍布背景的噪点
对比Zkweb的DrawRectangle,我暂时只能用曲线救国的方法,让整个画布遍布可以见的灰色正方形小点。除了这个噪点干扰外,我同时也画了两条贝塞尔样条。
for (int i = 0; i < 50; i++)
{
GraphicsOptions noneDefault = new GraphicsOptions();
ImageSharp.Rectangle rectangle = new ImageSharp.Rectangle(random.Next(image.Width), random.Next(image.Height), 1, 1);//正方形小灰点
image.Draw(Color.Gray, 1f, rectangle, noneDefault);
}
3.绘制验证码
在Zkweb中绘制二维码使用的方法:
g.DrawString(code.Substring(i, 1), font, brush, 3 + (i * 12), ii);//绘制一个验证字符
对比ImageSharp:
image.DrawText(code.Substring(i, 1), font, brush, new System.Numerics.Vector2(3 + (i * 12), ii));//绘制一个验证字符
可以说是异曲同工,看上去就是函数的名称变化而已,参数还是一样的。同样的,Zkweb为了跨平台需要将用到的字体复制到对应的环境中。ImageSharp也是如此,好处是可以显式地指定字体的路径。
var fontCollection = new FontCollection();//目前只支持ttf格式的字体
var font1 = fontCollection.Install(ttfPath);//字体的路径,也就是可以使用配置文件来指定字体
var font2 = fontCollection.Install(ttfStream);//读取字体文件
3.效果
为了验证是否跨平台,特意在docker的环境中运行了一遍(没有Mac,无法测试是否能在mac上用),效果如下:
四.图形合成
ImageSharp支持同时处理多张图片(如果图片太大的话,可能处理不了)。利用这个功能,我可以把我的二维码放到一个模板中,生成一个类似海报的二维码图片,如下图:
海报模板
1.加载多张图片
using (FileStream streamTemple = System.IO.File.OpenRead(templeName))
using (FileStream streamQrcode = System.IO.File.OpenRead(myrcodName))
using (FileStream output = System.IO.File.OpenWrite(qrcodeName))
using ...
{
var imageTemple = new ImageSharp.Image(streamTemple);
var imageQrcode = new ImageSharp.Image(streamQrcode);
}
2.在模板上画出二维码
//在指定的位置画出二维码
imageTemple.DrawImage(imageQrcode, 100, new ImageSharp.Size(imageQrcode.Width, imageQrcode.Height), new ImageSharp.Point(imageTemple.Width / 3, imageTemple.Height / 2));
//时间
imageTemple.DrawText($"生成日期{DateTime.Now.ToString("yyyy.MM.dd")}", new SixLabors.Fonts.Font(font, imageTemple.Width / 40, FontStyle.Regular), new ImageSharp.Color(0, 0, 0), new System.Numerics.Vector2(imageTemple.Width* 1/3, imageTemple.Height*9/10));
其中,Point代表的是位移,x是从左到右,y是从下到上。