.NET Core:使用ImageSharp跨平臺處理圖像

一.簡述

ImageSharp是一個新的跨平臺2D圖形API,旨在處理圖像而不使用System.Drawing。

二.安裝

目前ImageSharp還是處於alpha版本,所以我們需要在nuget中添加它的地址:https://www.myget.org/F/imagesharp


 

三.畫驗證碼(點我查看源碼)

在使用ImageSharp之前,已經有基於Zkweb.system.drawing的.netcore跨平臺驗證碼方案,爲了很好的做對比,這裏參考http://www.cnblogs.com/yuangang/p/6000460.html
1.生成畫布或者在其他圖片上畫

using (image = new Image(400, 400))
using (FileStream streamTemple = System.IO.File.OpenRead(someImg))
using (var pixels = image.Lock())
{
}

2.繪製遍佈背景的噪點
對比Zkweb的DrawRectangle,我暫時只能用曲線救國的方法,讓整個畫布遍佈可以見的灰色正方形小點。除了這個噪點干擾外,我同時也畫了兩條貝塞爾樣條。

 for (int i = 0; i < 50; i++)
{
   GraphicsOptions noneDefault = new GraphicsOptions();
   ImageSharp.Rectangle rectangle = new ImageSharp.Rectangle(random.Next(image.Width), random.Next(image.Height), 1, 1);//正方形小灰點
   image.Draw(Color.Gray, 1f, rectangle, noneDefault);
}

3.繪製驗證碼
在Zkweb中繪製二維碼使用的方法:

g.DrawString(code.Substring(i, 1), font, brush, 3 + (i * 12), ii);//繪製一個驗證字符

對比ImageSharp:

image.DrawText(code.Substring(i, 1), font, brush, new System.Numerics.Vector2(3 + (i * 12), ii));//繪製一個驗證字符

可以說是異曲同工,看上去就是函數的名稱變化而已,參數還是一樣的。同樣的,Zkweb爲了跨平臺需要將用到的字體複製到對應的環境中。ImageSharp也是如此,好處是可以顯式地指定字體的路徑。

  var fontCollection = new FontCollection();//目前只支持ttf格式的字體
  var font1 = fontCollection.Install(ttfPath);//字體的路徑,也就是可以使用配置文件來指定字體
  var font2 =  fontCollection.Install(ttfStream);//讀取字體文件

3.效果
爲了驗證是否跨平臺,特意在docker的環境中運行了一遍(沒有Mac,無法測試是否能在mac上用),效果如下:


效果

四.圖形合成

ImageSharp支持同時處理多張圖片(如果圖片太大的話,可能處理不了)。利用這個功能,我可以把我的二維碼放到一個模板中,生成一個類似海報的二維碼圖片,如下圖:


海報模板


1.加載多張圖片

using (FileStream streamTemple = System.IO.File.OpenRead(templeName))
using (FileStream streamQrcode = System.IO.File.OpenRead(myrcodName))
using (FileStream output = System.IO.File.OpenWrite(qrcodeName))
using ...
{
    var imageTemple = new ImageSharp.Image(streamTemple);
    var imageQrcode = new ImageSharp.Image(streamQrcode);
}

2.在模板上畫出二維碼

//在指定的位置畫出二維碼
 imageTemple.DrawImage(imageQrcode, 100, new ImageSharp.Size(imageQrcode.Width, imageQrcode.Height), new ImageSharp.Point(imageTemple.Width / 3, imageTemple.Height / 2));
//時間
 imageTemple.DrawText($"生成日期{DateTime.Now.ToString("yyyy.MM.dd")}", new SixLabors.Fonts.Font(font, imageTemple.Width / 40, FontStyle.Regular), new ImageSharp.Color(0, 0, 0), new System.Numerics.Vector2(imageTemple.Width* 1/3, imageTemple.Height*9/10));

其中,Point代表的是位移,x是從左到右,y是從下到上。
3.最終效果


最終效果
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章