.NET Core利用skiasharp文字頭像生成方法教程(基于docker發(fā)布)
一、問題背景
目前.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ù)組,如果需要轉(zhuǎn)成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內(nèi)部沒有中文字體,SO,當要輸出中文的時候就狗帶了,如下圖,所及解決辦法那也就是把字體拷貝到docker內(nèi)部中去
下面提供我自己使用的Dockerfile,具體Dockerfile怎么用,那就只能大家自己百度百度(ps:其實真實原因是我自己這方面也是弱雞- -,怕誤導大家),我的環(huán)境是CentOS7.3的環(huán)境
#基于 `microsoft/dotnet:latest` 來構(gòu)建我們的鏡像 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 #更換軟件源為國內(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 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地址
四、總結(jié)
docker是個好東西,只是我太弱雞,大概需要花更多的時間去學習吧,程序員可能真的得活到老學到老!
PS:以上的只是我自己摸索出來的,如果大家有更好的實現(xiàn)方式歡迎討論,謝謝觀看
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
如何在前臺腳本通過json傳遞數(shù)據(jù)到后臺(使用微軟自帶的ajax)
這篇文章主要介紹了如何使用微軟自帶的ajax在前臺腳本通過json傳遞數(shù)據(jù)到后臺的實現(xiàn)方法2013-08-08
ASP.NET MVC中將控制器分離到類庫的實現(xiàn)
這篇文章主要介紹了ASP.NET MVC中將控制器分離到類庫的實現(xiàn)的相關(guān)資料,需要的朋友可以參考下2015-06-06
ASP.NET?Core項目中調(diào)用WebService的方法
這篇文章介紹了ASP.NET?Core項目中調(diào)用WebService的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
輕量級ORM框架Dapper應用之實現(xiàn)Join操作
本文詳細講解了使用Dapper實現(xiàn)Join操作,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03
VisualStudio2019中為.NET Core WinForm App啟用窗體設計器
這篇文章主要介紹了VisualStudio2019中為.NET Core WinForm App啟用窗體設計器,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-04-04
ASP.NET堆和棧三之引用類型對象拷貝和內(nèi)存分配
這篇文章介紹了ASP.NET堆和棧中引用類型對象的拷貝和內(nèi)存分配,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
ASP.NET2.0 WebRource,開發(fā)微調(diào)按鈕控件
ASP.NET2.0 WebRource,開發(fā)微調(diào)按鈕控件...2006-09-09

