一、问题背景
目前。净核心下面针对于图像处理的库微软并没有集成,在. NET FrameWork下我们已经习惯使用系统。图画类库做简单的图像处理,到了。净核心下一脸懵逼的我,只能百度谷歌看看有没啥解决方案,好在网上资料也多,净核心下的图像处理还是有些开源库的,我目前使用的其中一个:SkiaSharp,介绍反正大家自己网上找找都有,下面就用该库实现一个文字头像的小功能,话不多说了,来一起看看详细的介绍吧。
二、简单的设计要求
对于输入的名字得解析(中文、英文)图片背景色随机会换文字要居中(废话,不居中不是丑爆了)三、具体实现
1、解析姓名信息
私有字符串解析名称(字符串图像文本){图像文本。替换('?', '').替换(' : ',' ')。替换('?', '').替换("*")。替换(',')。替换(',')。替换(@'/',' ')。替换(@' ',' ')。替换(@'| ',' ')。替换(' ' ',' ');//去除路径不支持的信息图像文本=图像文本.修剪(' ');//去除空格信息字符串temp2=imageText .子串(0,1);//根据第一位的数据判断是走英文规则还是中文规则,都不是的话就是取前两位if (RegexLib .ischinesecharter(temp 2)){//UserName=UserName .修剪(' ');if (imageText .长度2图像文本。长度=3) { imageText=imageText .子串(1,2);} else if (imageText .长度=3) { imageText=imageText .子字符串(图像文本.长度- 2,2);} } else if (RegexLib .isenglish character(temp 2)){ String[]temp 1=图像文本.拆分("");if (temp1 .长度==2) { imageText=(temp1[0].子字符串(0,1)温度1[1]。子串(0,1))。toupper();} else { if (imageText .长度2) { imageText=imageText .子串(0,2)。toupper();} } } else { if (imageText .长度2) { imageText=imageText .子串(0,2);} } imageName=imageText返回imageName}2、根据文字生成图片
公共字节[]创建(){ 0字符串名称=imageName ' .jpg ';SKBitmap bmp=new SKBitmap(128,128);字符串字符串=imageName使用(SKCanvas canvas=new SKCanvas(BMP)){ Random r=new Random();int num=r.Next(0,9);帆布绘制颜色(colors[num]);//颜色是图片背景颜色集合,这里代码就不贴出来了,随机找一个使用(SKPaint SKPaint=new SKPaint()){ SKPaint .颜色=SKColors .白色;//字体颜色sKPaint .TextSize=39//字体大小sKPaint .is anialias=true//开启抗锯齿sKPaint .字样=SkiaSharp .skfont。从姓('微软雅黑,SKTypefaceStyle .粗体);//字体SKRect size=new SKRect();sKPaint .测量文本(字符串,引用大小);//计算文字宽度以及高度浮点温度=(128大小。尺寸。宽度)/2;float temp1=(128大小。尺寸。高度)/2;帆布DrawText(字符串,临时,临时一大小Top,sKPaint);//画文字} //保存成图片文件使用(浏览img=浏览.从位图(bmp))(使用(SKData p=img .编码(skencodimageformat .Jpeg,100)){将p .返回到数组();//使用(变量流=文件。创建(路径。组合(AppDomain .CurrentDomain。BaseDirectory,‘photoImage’,name))//{//stream .写(p.ToArray(),0,p.ToArray().长度);//返回流;//} } } } }我这边只是得到的是字节[]数组,如果需要转成溪流或者保存成文件,方法都有,找找肯定都可以找到的,我就不放出来了,
三码头工人发布的坑
坑1:IIS下可以码头工人下报错的坑爹问题
由于skiasharp在windows和linux下使用的依赖库不同,“Skia Sharp的类型初始值设定项”。如果以前面的方式部署,磁盘映像信息“抛出异常”将出现在docker中。原因是在linux下,skiasharp依赖于libSkiaSharp.so,如果系统中没有libSkiaSharp.so,就会报错。目前我最简单的操作就是找到这个文件,扔到skiasharp的目录下,然后就可以了
坑2:中文字体不被识别
因为docker中没有中文字体,所以,当你想要输出中文的时候,就会自带,如下图所示。解决方案是将字体复制到docker中
下面提供我自己的Dockerfile。怎么用Dockerfile,那就只能百度百度了(ps:其实真正的原因是我在这方面也是个弱鸡,怕误导大家),我的环境是CentOS7.3。
#基于来自Microsoft/dotnet:最新版本的` microsoft/dotnet:latest '构建我们的映像#将项目发布文件夹中的所有文件复制到docker容器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/Dejavucopy MSYHL。TTC/usr/share/fonts/Dejavucopy MSYHBD。TTC/Usr/share/fonts/dejavu#将软件源替换为国内软件源runmv/etc/apt/sources . list/etc/apt/sources . list . bak echo ' deb http://mirrors.163.com/debian/杰西主要非自由贡献者'/etc/apt/sources . list echo ' deb http://mirrors.163.com/debian/杰西-提议-更新主要非自由贡献者'/etc/apt/sources . list echo ' deb-src http://mirrors.163.com/debian/杰西主要非自由贡献者'/etc/apt/sources . list echo ' deb ' src http://mirrors.163.com/debian/杰西文件夹,即容器启动默认文件夹WORKDIR /publish#设置Docker容器向外界公开5000个端口EXPOSE 5000#使用` dotnet WebApplication1.dll '运行应用cmd ['dotnet ',' webapplication1.dll']。
最后一个演示地址
四.摘要
Docker是个好东西,但是我太弱了,所以我可能需要花更多的时间学习。程序员可能真的要生活和学习了!
PS:或以上仅由我自己发现。如果你有更好的实现方式,请讨论。感谢您观看
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。