日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

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

發(fā)布時間:2023/12/4 asp.net 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core使用skiasharp文字头像生成方案(基于docker发布) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、問題背景

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

二、簡單的設計要求

  • 對于輸入的名字得解析(中文、英文)

  • 圖片背景色隨機會換

  • 文字要居中(廢話,不居中不是丑爆了)

三、具體實現(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是圖片背景顏色集合,這里代碼就不貼出來了,隨機找一個

? ? ? ? ? ? ? ? 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[]數(shù)組,如果需要轉成stream或者保存成文件,方法都有,找找肯定都可以找到的,我就不放出來了,

三、docker發(fā)布的坑

坑1:IIS下可以,docker下報錯的坑爹問題

  由于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,就會報這個錯,目前我最簡單的操作就是找到這個文件扔在skiasharp的目錄下,然后就可以了

坑2:中文字體不識別

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

  

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

#基于 `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:以上的只是我自己摸索出來的,如果大家有更好的實現(xiàn)方式歡迎討論,謝謝觀看

相關文章:

  • 開源免費的.NET圖像即時處理的組件ImageProcessor

  • ImageSharp一個專注于NetCore平臺圖像處理的開源項目


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


.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com

總結

以上是生活随笔為你收集整理的.NET Core使用skiasharp文字头像生成方案(基于docker发布)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。