国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET Core利用skiasharp文字頭像生成方法教程(基于docker發(fā)布)

2024-07-10 13:33:00
字體:
供稿:網(wǎng)友

一、問題背景

目前.NET Core下面針對于圖像處理的庫微軟并沒有集成,在.NET FrameWork下我們已經(jīng)習(xí)慣使用System.Drawing類庫做簡單的圖像處理,到了.NET Core下一臉懵逼的我,只能百度+谷歌看看有沒啥解決方案,好在網(wǎng)上資料也多,.NET Core下的圖像處理還是有些開源庫的,我目前使用的其中一個:SkiaSharp,介紹反正大家自己網(wǎng)上找找都有,下面就用該庫實(shí)現(xiàn)一個文字頭像的小功能,話不多說了,來一起看看詳細(xì)的介紹吧。

二、簡單的設(shè)計(jì)要求

  • 對于輸入的名字得解析(中文、英文)
  • 圖片背景色隨機(jī)會換
  • 文字要居中(廢話,不居中不是丑爆了)

三、具體實(shí)現(xiàn)

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);//根據(jù)第一位的數(shù)據(jù)判斷是走英文規(guī)則還是中文規(guī)則,都不是的話就是取前兩位   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、根據(jù)文字生成圖片

  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是圖片背景顏色集合,這里代碼就不貼出來了,隨機(jī)找一個    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);//計(jì)算文字寬度以及高度     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[]數(shù)組,如果需要轉(zhuǎn)成stream或者保存成文件,方法都有,找找肯定都可以找到的,我就不放出來了,

三、docker發(fā)布的坑

坑1:IIS下可以,docker下報(bào)錯的坑爹問題

由于skiasharp在windows跟linux下使用的依賴庫是不同的,如果都按照以前的方式部署,在docker里就會出現(xiàn)"The type initializer for 'SkiaSharp.SKImageInfo' threw an exception",原因是linux下skiasharp依賴libSkiaSharp.so,而如果系統(tǒng)中沒有l(wèi)ibSkiaSharp.so,就會報(bào)這個錯,目前我最簡單的操作就是找到這個文件扔在skiasharp的目錄下,然后就可以了

坑2:中文字體不識別

由于docker內(nèi)部沒有中文字體,SO,當(dāng)要輸出中文的時候就狗帶了,如下圖,所及解決辦法那也就是把字體拷貝到docker內(nèi)部中去

.net,core,docker,skiasharp,文字頭像生成  

下面提供我自己使用的Dockerfile,具體Dockerfile怎么用,那就只能大家自己百度百度(ps:其實(shí)真實(shí)原因是我自己這方面也是弱雞- -,怕誤導(dǎo)大家),我的環(huán)境是CentOS7.3的環(huán)境

#基于 `microsoft/dotnet:latest` 來構(gòu)建我們的鏡像FROM microsoft/dotnet:latest#拷貝項(xiàng)目publish文件夾中的所有文件到 docker容器中的publish文件夾中 COPY . /publish /publish/#ENV LANG C.UTF-8#ENV LANGUAGE C.UTF-8#ENV LC_ALL C.UTF-8COPY MSYH.TTC /usr/share/fonts/dejavuCOPY MSYHL.TTC /usr/share/fonts/dejavuCOPY MSYHBD.TTC /usr/share/fonts/dejavu#更換軟件源為國內(nèi)的軟件源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 fontconfigRUN apt-get update && apt-get install -y fontconfig#設(shè)置工作目錄為 `/publish` 文件夾,即容器啟動默認(rèn)的文件夾WORKDIR /publish#設(shè)置Docker容器對外暴露5000端口EXPOSE 5000#使用`dotnet WebApplication1.dll`來運(yùn)行應(yīng)用程序CMD ["dotnet", "WebApplication1.dll"]

上張成功的圖:

.net,core,docker,skiasharp,文字頭像生成  

最后DEMO地址

四、總結(jié)

docker是個好東西,只是我太弱雞,大概需要花更多的時間去學(xué)習(xí)吧,程序員可能真的得活到老學(xué)到老!

PS:以上的只是我自己摸索出來的,如果大家有更好的實(shí)現(xiàn)方式歡迎討論,謝謝觀看

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到ASP.NET教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 莱阳市| 民和| 怀宁县| 彰化市| 珠海市| 连城县| 集安市| 岳西县| 尼木县| 德化县| 霍城县| 霞浦县| 宝兴县| 仙居县| 搜索| 来宾市| 勐海县| 阳山县| 县级市| 景洪市| 芦山县| 开封县| 大余县| 阿克陶县| 瑞丽市| 泗水县| 双江| 石景山区| 新丰县| 茌平县| 阆中市| 西丰县| 喀喇沁旗| 焦作市| 九龙县| 长寿区| 甘南县| 师宗县| 乡宁县| 安阳市| 蒙山县|