.NET Core利用skiasharp文字头像生成方法教程(基于docker发布)
一、问题背景
目前.net core下面针对于图像处理的库微软并没有集成,在.net framework下我们已经习惯使用system.drawing类库做简单的图像处理,到了.net core下一脸懵逼的我,只能百度+谷歌看看有没啥解决方案,好在网上资料也多,.net core下的图像处理还是有些开源库的,我目前使用的其中一个:skiasharp,介绍反正大家自己网上找找都有,下面就用该库实现一个文字头像的小功能,话不多说了,来一起看看详细的介绍吧。
二、简单的设计要求
- 对于输入的名字得解析(中文、英文)
- 图片背景色随机会换
- 文字要居中(废话,不居中不是丑爆了)
三、具体实现
1、解析姓名信息
private string resolvename(string imagetext) { imagetext.replace("?", "").replace(":", "").replace("?", "").replace("*", "").replace("<", "").replace(">", "").replace(@"/", "").replace(@"\", "").replace(@"|", "").replace("\"", "");//去除路径不支持的信息 imagetext = imagetext.trim(' ');//去除空格信息 string temp2 = imagetext.substring(0, 1);//根据第一位的数据判断是走英文规则还是中文规则,都不是的话就是取前两位 if (regexlib.ischinesecharacter(temp2)) { //username = username.trim(' '); if (imagetext.length > 2 & imagetext.length <= 3) { imagetext = imagetext.substring(1, 2); } else if (imagetext.length >= 3) { imagetext = imagetext.substring(imagetext.length - 2, 2); } } else if (regexlib.isenglishcharacter(temp2)) { string[] temp1 = imagetext.split(' '); if (temp1.length == 2) { imagetext = (temp1[0].substring(0, 1) + temp1[1].substring(0, 1)).toupper(); } else { if (imagetext.length > 2) { imagetext = imagetext.substring(0, 2).toupper(); } } } else { if (imagetext.length > 2) { imagetext = imagetext.substring(0, 2); } } imagename = imagetext; return imagename; }
2、根据文字生成图片
public byte[] create() { string name = imagename + ".jpg"; skbitmap bmp = new skbitmap(128, 128); string str = imagename; using (skcanvas canvas = new skcanvas(bmp)) { random r = new random(); int num = r.next(0, 9); canvas.drawcolor(colors[num]); // colors是图片背景颜色集合,这里代码就不贴出来了,随机找一个 using (skpaint skpaint = new skpaint()) { skpaint.color = skcolors.white;//字体颜色 skpaint.textsize = 39;//字体大小 skpaint.isantialias = true;//开启抗锯齿 skpaint.typeface = skiasharp.sktypeface.fromfamilyname("微软雅黑", sktypefacestyle.bold);//字体 skrect size = new skrect(); skpaint.measuretext(str, ref size);//计算文字宽度以及高度 float temp = (128 - size.size.width) / 2; float temp1 = (128 - size.size.height) / 2; canvas.drawtext(str, temp, temp1 - size.top, skpaint);//画文字 } //保存成图片文件 using (skimage img = skimage.frombitmap(bmp)) { using (skdata p = img.encode(skencodedimageformat.jpeg, 100)) { return p.toarray(); //using (var stream = file.create(path.combine(appdomain.currentdomain.basedirectory, "photoimage", name))) //{ // stream.write(p.toarray(), 0, p.toarray().length); // return stream; //} } } } }
我这边只是得到的是byte[]数组,如果需要转成stream或者保存成文件,方法都有,找找肯定都可以找到的,我就不放出来了,
三、docker发布的坑
坑1:iis下可以,docker下报错的坑爹问题
由于skiasharp在windows跟linux下使用的依赖库是不同的,如果都按照以前的方式部署,在docker里就会出现"the type initializer for 'skiasharp.skimageinfo' threw an exception",原因是linux下skiasharp依赖libskiasharp.so,而如果系统中没有libskiasharp.so,就会报这个错,目前我最简单的操作就是找到这个文件扔在skiasharp的目录下,然后就可以了
坑2:中文字体不识别
由于docker内部没有中文字体,so,当要输出中文的时候就狗带了,如下图,所及解决办法那也就是把字体拷贝到docker内部中去
下面提供我自己使用的dockerfile,具体dockerfile怎么用,那就只能大家自己百度百度(ps:其实真实原因是我自己这方面也是弱鸡- -,怕误导大家),我的环境是centos7.3的环境
#基于 `microsoft/dotnet:latest` 来构建我们的镜像 from microsoft/dotnet:latest #拷贝项目publish文件夹中的所有文件到 docker容器中的publish文件夹中 copy . /publish /publish/ #env lang c.utf-8 #env language c.utf-8 #env lc_all c.utf-8 copy msyh.ttc /usr/share/fonts/dejavu copy msyhl.ttc /usr/share/fonts/dejavu copy msyhbd.ttc /usr/share/fonts/dejavu #更换软件源为国内的软件源 run mv /etc/apt/sources.list /etc/apt/sources.list.bak && \ echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib" >/etc/apt/sources.list && \ echo "deb http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list && \ echo "deb-src http://mirrors.163.com/debian/ jessie main non-free contrib" >>/etc/apt/sources.list && \ echo "deb-src http://mirrors.163.com/debian/ jessie-proposed-updates main non-free contrib" >>/etc/apt/sources.list #run apt-get update && apt-get install -y libfontconfig1 && apt-get install -y fontconfig run apt-get update && apt-get install -y fontconfig #设置工作目录为 `/publish` 文件夹,即容器启动默认的文件夹 workdir /publish #设置docker容器对外暴露5000端口 expose 5000 #使用`dotnet webapplication1.dll`来运行应用程序 cmd ["dotnet", "webapplication1.dll"]
上张成功的图:
最后demo地址
四、总结
docker是个好东西,只是我太弱鸡,大概需要花更多的时间去学习吧,程序员可能真的得活到老学到老!
ps:以上的只是我自己摸索出来的,如果大家有更好的实现方式欢迎讨论,谢谢观看
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。
下一篇: PHP实现断点续传乱序合并文件的方法