.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(, );//根据第一位的数据判断是走英文规则还是中文规则,都不是的话就是取前两位
if (RegexLib.IsChineseCharacter(temp2))
{
//UserName = UserName.Trim(' ');
if (imageText.Length > & imageText.Length <= )
{
imageText = imageText.Substring(, );
}
else if (imageText.Length >= )
{
imageText = imageText.Substring(imageText.Length - , );
}
}
else if (RegexLib.IsEnglishCharacter(temp2))
{
String[] temp1 = imageText.Split(' ');
if (temp1.Length == )
{
imageText = (temp1[].Substring(, ) + temp1[].Substring(, )).ToUpper();
}
else
{
if (imageText.Length > )
{
imageText = imageText.Substring(, ).ToUpper();
}
}
}
else
{
if (imageText.Length > )
{
imageText = imageText.Substring(, );
}
}
imageName = imageText;
return imageName;
}
2、根据文字生成图片
public byte[] Create()
{
String name = imageName + ".jpg";
SKBitmap bmp = new SKBitmap(, );
String str = imageName; using (SKCanvas canvas = new SKCanvas(bmp))
{ Random r = new Random();
int num = r.Next(, );
canvas.DrawColor(colors[num]); // colors是图片背景颜色集合,这里代码就不贴出来了,随机找一个
using (SKPaint sKPaint = new SKPaint())
{
sKPaint.Color = SKColors.White;//字体颜色
sKPaint.TextSize = ;//字体大小
sKPaint.IsAntialias = true;//开启抗锯齿
sKPaint.Typeface = SkiaSharp.SKTypeface.FromFamilyName("微软雅黑", SKTypefaceStyle.Bold);//字体
SKRect size = new SKRect();
sKPaint.MeasureText(str, ref size);//计算文字宽度以及高度
float temp = ( - size.Size.Width) / ;
float temp1 = ( - size.Size.Height) / ;
canvas.DrawText(str, temp, temp1 - size.Top, sKPaint);//画文字
}
//保存成图片文件
using (SKImage img = SKImage.FromBitmap(bmp))
{
using (SKData p = img.Encode(SKEncodedImageFormat.Jpeg, ))
{
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"]
上张成功的图:

四、总结
docker是个好东西,只是我太弱鸡,大概需要花更多的时间去学习吧,程序员可能真的得活到老学到老!
PS:以上的只是我自己摸索出来的,如果大家有更好的实现方式欢迎讨论,谢谢观看
最后熊本熊镇随笔,该死的K8S,该死的docker!!!

作者: Mango
出处: http://www.cnblogs.com/OMango/
关于自己:专注.Net桌面开发以及Web后台开发,开始接触微服务、docker等互联网相关(最近被互联网架构搞的死去活来- -)
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如有问题, 可站内留言联系.
.NET Core使用skiasharp文字头像生成方案(基于docker发布)的更多相关文章
- GAN网络之入门教程(五)之基于条件cGAN动漫头像生成
目录 Prepare 在上篇博客(AN网络之入门教程(四)之基于DCGAN动漫头像生成)中,介绍了基于DCGAN的动漫头像生成,时隔几月,序属三秋,在这篇博客中,将介绍如何使用条件GAN网络(cond ...
- 一种基于Orleans的分布式Id生成方案
基于Orleans的分布式Id生成方案,因Orleans的单实例.单线程模型,让这种实现变的简单,贴出一种实现,欢迎大家提出意见 public interface ISequenceNoGenerat ...
- 【php】mysql全局ID生成方案
生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙涨时,MySQL DBA往往会对业务系统提出sharding ...
- MySQL分库分表环境下全局ID生成方案 转
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...
- MySQL分库分表环境下全局ID生成方案
在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库 ...
- 【转】MySQL分库分表环境下全局ID生成方案
转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大 ...
- ASP.NET Core使用SkiaSharp实现验证码
前言 本文并没有实现一个完成的验证码样例,只是提供了在当前.NET Core 2.0下使用Drawing API的另一种思路,并以简单Demo的形式展示出来. Skia Skia是一个开源的二维图形库 ...
- asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档
asp.net core中使用Swashbuckle.AspNetCore(swagger)生成接口文档 Swashbuckle.AspNetCore:swagger的asp.net core实现 项 ...
- Core文件简单介绍及生成设置方法
Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...
随机推荐
- Navicat的使用
Navicat的使用 navicat作为一种数据库的操作工具,在工作中使用的频率很高.相比phpMyAdmin而言,无论是从界面操作的易用性上,还是外观上,抑或是IP的配置上都有着很大的突出优势.ph ...
- Java实现邮箱验证
Java实现邮箱验证 JavaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开 ...
- js内存泄露的原因
1.意外的全局变量 function fun(){ a=19//全局变量 console.log(a) } 2.未及时清理计时器或者回调函数 //记得及时清理定时器 var intervalId=se ...
- 使用commons-csv简单读写CSV文件
文章首发于我的github博客 需求 客户的开发测试环境将做迁移.因此需要对zookeeper上的重要的数据以CSV文件格式做备份. 本文通过Apache的commons-csv操作CSV文件.官网地 ...
- RGB与HSV之间的转换公式及颜色表
RGB & HSV 英文全称 RGB - Red, Green, Blue HSV - Hue, Saturation, Value HSV --> RGB 转换公式 HSV --> ...
- hdu 1010 回溯加奇偶性剪枝
普通的剪枝会超时,必须加入奇偶性剪枝. 直接上图: AC代码: #include<cstdio> #include<cstring> #include<algorithm ...
- 试着简单易懂记录synchronized this object Class的区别,模拟ConcurrentHashMap
修饰静态方法默认获取当前class的锁,同步方法没有释放的锁,不影响class其他非同步方法的调用,也不影响不同锁的同步方法,更不影响使用class的其他属性. package thread.base ...
- python模拟登录浙江大学彩云库
前言: 群里一位朋友叫我帮他写 一个模拟登录的. 代码: import requests import time url="http://yk3.gokuai.com/web/index&q ...
- python中 字符 字典 列表之间的转换
1 字典 转 字符 定义一个字典:dict = {'name': 'python', 'age': 7}字典转字符 可以使用str强制转换 如: str(dict) 此时dict的类型就是字符型了 2 ...
- caffe错误
一些caffe错误 训练时很快梯度爆炸,loss猛增至nan 如果找不到数据上的原因的话,可以怀疑caffe框架有问题,换用其它版本试试.比如我遇到的问题是在训练时使用了Accuracy层,而该层的实 ...