一问题背景
目前. 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: 以上的只是我自己摸索出来的, 如果大家有更好的实现方式欢迎讨论, 谢谢观看
最后熊本熊镇随笔, 该死的 K8S, 该死的 docker!!!
来源: https://www.cnblogs.com/OMango/p/8519980.html