SkiaSharp图像处理

.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地址

  libSkiaSharp.so地址

四、总结

  docker是个好东西,只是我太弱鸡,大概需要花更多的时间去学习吧,程序员可能真的得活到老学到老!

  PS:以上的只是我自己摸索出来的,如果大家有更好的实现方式欢迎讨论,谢谢观看

  最后熊本熊镇随笔,该死的K8S,该死的docker!!!

作者: Mango

出处: http://www.cnblogs.com/OMango/

SkiaSharp图像处理的更多相关文章

  1. ASP.NET Core使用SkiaSharp实现验证码

    前言 本文并没有实现一个完成的验证码样例,只是提供了在当前.NET Core 2.0下使用Drawing API的另一种思路,并以简单Demo的形式展示出来. Skia Skia是一个开源的二维图形库 ...

  2. .NET Core使用skiasharp文字头像生成方案(基于docker发布)

    一.问题背景 目前.NET Core下面针对于图像处理的库微软并没有集成,在.NET FrameWork下我们已经习惯使用System.Drawing类库做简单的图像处理,到了.NET Core下一脸 ...

  3. skiasharp在阿里云Windows server 2016上部署时提示The type initializer for 'SkiaSharp.SKAbstractManagedStream' threw an exception. 错误

    应用环境及问题描述: Windows Server 2016,.Net core 2.1, Skiasharp作为跨平台的图像处理组件在生成缩略图时出错,本地测试都是正常的,部署到服务器无法生成缩略图 ...

  4. Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉

    Atitit 图像处理和计算机视觉的分类 三部分 图像处理 图像分析 计算机视觉 1.1. 按照当前流行的分类方法,可以分为以下三部分:三部分 图像处理 图像分析 计算机视觉1 1.2. 图像处理需要 ...

  5. Atitit 图像处理的摩西五经attilax总结

    Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...

  6. Atitit 图像处理的心得与疑惑 attilax总结

    Atitit 图像处理的心得与疑惑 attilax总结 1.1. 使用类库好不好??还是自己实现算法1 1.2. 但是,如果遇到类库体积太大,后者没有合适的算法,那就只能自己开发算法了1 1.3. 如 ...

  7. Atitit 图像处理 调用opencv 通过java  api   attilax总结

    Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...

  8. Atitit MATLAB 图像处理 经典书籍attilax总结

    Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...

  9. Atitit 图像处理类库大总结attilax qc20

    Atitit 图像处理类库大总结attilax qc20 1.1. 选择与组合不同的图像处理类库1 1.2. Halcon 貌似商业工具,功能强大.1 1.3. Openvc  Openvc功能也是比 ...

随机推荐

  1. 每日分享!~ JavaScript(js数组如何在指定的位置插入一个元素)

      这个想法是在一个面试题中看到的: 题目是这样的: // 一个数组,在指定的index 位置插入一个元素,返回一个新的数组,不改变原来的数组 <script> function inse ...

  2. Optimizing Java笔记:高级垃圾回收

    原书地址:https://www.safaribooksonline.com/library/view/optimizing-java/9781492039259/ 感觉挺不错的一本书,断断续续在读. ...

  3. python:socket网络编程

    Socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket, 又称为“套接字”. 模块 import socket 创建套接字 socket.socket( ...

  4. 【Zabbix】CentOS6.9系统下部署Zabbix-server 3.0

    目录 安装Zabbix 关闭selinux 删除旧版本MySQL5.1数据库 安装MySQL 5.6数据库 安装PHP 5.6 Zabbix-server的部署安装 1.安装Yum源 2.安装Zabb ...

  5. JCE安装使用报错

    "description":"No key was installed for encryption service","status":& ...

  6. Writing a Simple Service and Client (C++)

    此前说的publisher/subscriber都是广播式的,subscriber被动地接收消息,二者没有request/response这种交互. Service Node Client Node ...

  7. 如何使用.net开发一款小而美的O2O移动应用? ——“家庭小秘”APP介绍及采访记录

    “家庭小秘”是一款“互联网+生活服务”平台,为市民家庭提供优质家庭生活服务和企业后勤服务,包含了用户注册.购买预约.订单查询.充值付款.即时通讯等功能. 这款应用已上线至AppStore和安卓的应用商 ...

  8. AI产品的商业模式

    AI产品的商业模式 ------------------------------------------------------------------------------------------ ...

  9. jQuery(五)、筛选

    1 过滤 1.eq(index | -index) 获取第N个元素,index为元素索引,-index值基于最后一个元素的位置(从 1 开始) 2.first() 获取第一个元素 3.last() 获 ...

  10. 华途软件受控XML转EXCEL

    公司加密系统用的是华途的产品.最近公司高层想要重新梳理公司信息安全管理情况,华途加密系统的梳理和优化是重中之重. 今天公司领导要求IT导出目前系统中所有软件.后缀的受控情况,然后IT吭哧吭哧地把华途软 ...