一.簡述
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.最終效果
