.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:以上的只是我自己摸索出来的,如果大家有更好的实现方式欢迎讨论,谢谢观看

相关文章:

  • 开源免费的.NET图像即时处理的组件ImageProcessor

  • ImageSharp一个专注于NetCore平台图像处理的开源项目


原文:https://www.cnblogs.com/OMango/p/8519980.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jzoj6375-华灵「蝶妄想」【结论题】

正题 题目大意 n∗mn*mn∗m填(((或者)))。求一个方案使得最多的行和列匹配。 解题思路 我们先考虑nnn或mmm为奇数&#xff0c;那么显然奇数的肯定不必配&#xff0c;那么就只需要考虑行或列即可。 若nnn和mmm都为偶数时 我们发现在边边的行列不可能都匹配上&#xff0c;那就…

C# - Span 全面介绍:探索 .NET 新增的重要组成部分

假设要公开特殊化排序例程&#xff0c;以就地对内存数据执行操作。可能要公开需要使用数组的方法&#xff0c;并提供对相应 T[] 执行操作的实现。如果方法的调用方有数组&#xff0c;且希望对整个数组进行排序&#xff0c;这样做就非常合适。但如果调用方只想对部分数组进行排序…

Java 并发总结——AQS

一、AQS Java并发包&#xff08;JUC&#xff09;中提供了很多并发工具&#xff0c;ReentrangLock、Semaphore、CountDownLatch&#xff0c;它们的实现都用到了一个共同的基类——AbstractQueuedSynchronizer&#xff0c;简称AQS。 AQS是一个用来构建锁和同步器的框架&#xf…

P4427-[BJOI2018]求和【LCA】

正题 题目大意:https://www.luogu.org/problem/P4427 题目大意 一棵树&#xff0c;每次给一条路径&#xff0c;求路径上每个点的深度的kkk次方的和。 解题思路 路径上分成两条深度连续的链&#xff0c;所以我们可以先预处理出kkk次方的前缀和。 然后LCALCALCA就好了。 code…

C#中DateTime的缺陷与代替品DateTimeOffset

C#中的DateTime在逻辑上有个非常严重的缺陷&#xff1a;> var d DateTime.Now;> var d2 d.ToUniversalTime();> d d2false> d.Equals(d2);false在C#交互模式中输入以上代码&#xff0c;可以发现尽管一个是本地时间&#xff08;d&#xff09;&#xff0c;一个是U…

Java SSL与TLS客户端证书配置

一、TLS安全概念 &#xff08;1&#xff09;PKI PKI是 Public Key Infrastructure的简称&#xff0c;意思是公钥基础设施。 公钥基础设施是提供公钥加密和数字签名服务的系统或平台&#xff0c;目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。 &#x…

P3901-数列找不同【模拟】

正题 题目链接:https://www.luogu.org/problem/P3901 题目大意 一个序列AAA&#xff0c;每次询问一个区间求这个区间的数是否各不相同。 解题思路 用lastilast_ilasti​表示前一个与iii相同数的位置。 然后Lastimax{lastj}(j<i)Last_imax\{last_j\}(j<i)Lasti​max{la…

Java RSA私钥的格式pkcs1和pkcs8、PrivateKey转换

&#xff08;&#xff09;一、私钥格式 &#xff08;1&#xff09;pkcs1 格式&#xff1a; -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY----- &#xff08;2&#xff09;pkcs8 格式&#xff1a; -----BEGIN PRIVATE KEY----- ... -----END PRIVATE KE…

重磅消息-Service Fabric 正式开源

微软的Azure Service Fabric的官方博客在2017.3.24日发布了一篇博客 Service Fabric .NET SDK goes open source &#xff0c;介绍了社区呼声最高的Service Fabric开源的情况以及当前的情况&#xff0c;当时开源了Service Fabric的.NET SDK部分&#xff0c;社区一直在期盼着Ser…

Java 证书pem转KeyStore、jks文件

一、服务端pem转KeyStore CertificateFactory certificateFactory CertificateFactory.getInstance("X.509");FileInputStream caInputStream new FileInputStream(caPath);List<X509Certificate> caList certificateFactory.generateCertificates(caInput…

牛客国庆集训派对day6T A- 2016【矩阵乘法】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/A 题目大意 2∗22*22∗2的矩阵AAA&#xff0c;求AnA^nAn 解题思路 我们将其十进制的转化过来&#xff0c;如 A2016(A103)2∗(A10)∗(A)6A^{2016}(A^{10^3})^2*(A^{10})*(A)^6A2016(A103)2∗(A10)∗(A)6 这样时间复杂…

.NET Core 配置Configuration杂谈

前言.NET Core 在配置文件的操作上相对于.NET Framework做了不少改变&#xff0c;今天来聊一聊。关于Configuration的Package都是以Microsoft.Extensions.Configuration开头的支持多种方式的配置&#xff0c;包括内存、Json文件、XML文件等等&#xff0c;今天我们主要用Json格式…

Java Jenkins Api

一、Maven <dependency><groupId>com.cdancy</groupId><artifactId>jenkins-rest</artifactId><version>0.0.20</version> </dependency> github地址&#xff1a;https://github.com/cdancy/jenkins-rest 如果需要最新的代…

秘密:从程序员到领导者的微妙之处

读到一篇关于程序员、领导力和领导者的好文章&#xff0c;翻译过来分享下。借用一句文中的话&#xff1a;“好吧&#xff0c;我只是个程序员&#xff0c;为什么需要领导&#xff1f;” &#xff0c;读完你就知道了。做一个优秀的领导者可能不是大部分程序员会立即认同的东西。许…

牛客国庆集训派对day6TJ-DefenseTower【贪心】

正题 题目链接:https://ac.nowcoder.com/acm/contest/1111/J 题目大意 一棵树&#xff0c;每个点有一个威力值&#xff0c;每次破坏一个点会受到与它相连没有破坏的点的威力值之和的伤害。求破坏所有点的最小伤害。 解题思路 因为是一棵树&#xff0c;所有我们可以看为每条边…

K8S Learning(1)——简介

一、Kubernetes kubernetes&#xff0c;是一个全新的基于容器技术的分布式架构领先方案&#xff0c;是谷歌严格保密十几年的秘密武器——Borg系统的一个开源版本&#xff0c;于2014年9月发布第一个版本&#xff0c;2015年7月发布第一个正式版本。 kubernetes的本质是一组服务…

老衣的微服务实践简要指引2017版

这是老衣在2017年5月份总结的&#xff0c;适用于中小团队跨平台微服务开发的实践指引&#xff08;简化版&#xff09;。若有有不当之处&#xff0c;欢迎指点更正因本文涉及到大量第三方库或工具&#xff0c;详细学习和了解需要参考相关官方文档。若您在使用Mac电脑&#xff0c;…

P2052-[NOI2011]道路修建【树】

正题 题目链接:https://www.luogu.org/problem/P2052 题目大意 一棵树&#xff0c;一条边的价值是长度乘上两端点的数量差。求所有边的边权之和。 解题思路 统计子树大小就可以知道两端的数量差了。 codecodecode #include<cstdio> #include<cstring> #include…

K8S Learning(2)——集群环境搭建

一、部署Kubernetes 集群 有两种方式&#xff1a; &#xff08;1&#xff09;kubeadm Kubeadm 是一个K8s 部署工具&#xff0c;提供kubeadm init 和kubeadm join&#xff0c;用于快速部署Kubernetes 集群。 官方地址&#xff1a;Kubeadm | Kubernetes &#xff08;2&#…

P2796-Facer的程序【dp】

正题 题目大意:https://www.luogu.org/problem/P2796 题目大意 求一棵树中有多少个子树。 解题思路 考虑dpdpdp。 fif_ifi​表示已iii这个点为根的子树个数。 动态转移方程fx∏x−>y(fy1)f_x\prod_{x->y}(f_y1)fx​x−>y∏​(fy​1) 答案就是∑i1nfi\sum_{i1}^nf_…