1. 程式人生 > >轉載(Asp.net Core 中試使用ZKWeb.System.Drawing)

轉載(Asp.net Core 中試使用ZKWeb.System.Drawing)

 

完美 原文Link: https://www.yanning.wang/archives/644.html

記錄下做備份. 很少用Linux伺服器. 這下可給整的夠嗆, 特別是按照官網竟然還不行, 所幸找到片文章,幫我解決了大問題. 本文主要針對 CentOS. Windows下應該不會有問題. 其他的沒試, 不好評論.

Zkweb.system.Drawing. Link:https://github.com/zkweb-framework/ZKWeb.System.Drawing

雖說微軟後續會出相關支援,但是現在要用, 只能按照這個先來.

Asp.net Core中使用GDI+繪圖

小柊 發表於 2018年01月01日 0時00分03秒

一、扯淡

光陰荏苒,日月如梭。轉眼2017年就這麼過去了。在這2017年裡本人遇見了很多人,遇到了很多事。如果要從其中挑出一件最遺憾的事情,那大概就是.net Core 2.0居然不支援System.Drawing名稱空間。

 

從.net Core出來開始,筆者就開始關注它了,無奈一開始的時候各種基礎庫都不完全,所以就把它放在第一位上。

後來聽說.net Core將在2017年年中的樣子釋出,順帶一塊釋出.net Standard 2.0,而.net Standard作為.net API的一個正式規範,支援相同.net Standard版本號的.net實現都應該支援相同的API,而.net Core 2.0和.net Framework 4.6.1都支援.net Standard 2.0,也就是說.net Core 2.0應該使用起來和.net Framework 4.6.1一致。(具體.net Standard實現支援請參閱:

https://docs.microsoft.com/en-us/dotnet/standard/net-standard

 

為了準備.net Core 2.0,我還特地將非Win32繫結的輔助類做了.net Standard適配。

然而非常遺憾的是在8月15日釋出的.net Core 2.0中,我們雖然看到了System.Drawing名稱空間的迴歸,但在這個名稱空間中,只有一些結構體,我們盼星星盼月亮期待著的Image和Graphics類依舊不存在。

 

二、解決辦法

.net Core 2.0出來之前和朋友吹牛打包票說:“你們放心,等.net Core 2.0出來了我就把我們之前的幾個系統遷過去。”結果牛逼是吹了,現在發現沒有繪相簿真的就很悲傷。

不過好在後來經過高人指點說,可以使用第三方庫去解決這個問題。

後來經過一番搜尋,發現有個叫做“ZKWeb.System.Drawing”的第三方庫,可以完美解決在.net Core 2.0上使用GDI+繪圖這個問題。

 

首先開啟專案,對著專案右鍵選擇“管理 NuGet 程式包”,然後在瀏覽頁中的搜尋框裡輸入“ZKWeb.System.Drawing”

 

然後安裝同名類庫。

 

第二步,將專案中所有“System.Drawing”改為“System.DrawingCore”即可。

 

現在就可以按F5進行除錯檢視效果了,非常完美。

 

三、注意事項

ZKWeb.System.Drawing這個第三方庫據作者所說,是移植於Mono 4.6.1.13,如果需要在Linux下執行使用,需要先安裝libgdiplus程式包。

如果沒有提前安裝libgdiplus程式包,程式在執行時會丟擲一個“System.TypeInitializationException”異常:

 

安裝libgdiplus程式包非常方便,以CentOS為例,只需要執行下面的命令:

 
1 2 3 4 5 6 7 8 9 10 11 12 yum install -y git yum install -y autoconf automake libtool yum install -y freetype-devel fontconfig libXft-devel yum install -y libjpeg-turbo-devel libpng-devel giflib-devel libtiff-devel libexif-devel yum install -y glib2-devel cairo-devel git clone https://github.com/mono/libgdiplus cd libgdiplus ./autogen.sh make make install cd /usr/lib64/ ln -s /usr/local/lib/libgdiplus.so gdiplus.dll

 

其他系統如何安裝libgdiplus,可以參閱Github上的ZKWeb.System.Drawing專案說明(專案地址:https://github.com/zkweb-framework/zkweb.system.drawing),現在ZKWeb.System.Drawing除了支援CentOS 7+以外,還支援Ubuntu 16.04+和Fedora 23+。

 

後記:

其實筆者在這裡用官方給出的方案並沒有成功,最後是用了下面的方案:

 
1 2 3 yum install -y epel-release yum makecache fast yum install -y libgdiplus-devel

 

在安裝好libgdiplus程式包之後重新執行專案發現,現在驗證碼是能夠成功繪製出來了,但驗證碼圖片上顯示的字元並不正確:

 

 

亂碼是什麼鬼?

經過排查,發現是因為筆者用的CentOS中,沒有繪製驗證碼時使用的“Arial”字型。所以我們還要新增所需字型。

要在CentOS中檢視當前系統已安裝的字型列表,請使用命令:

 
1 fc-list

 

如果不存在此命令,請使用下面的命令安裝:

 
1 yum -y install fontconfig

 

然後從Windows系統的C:\Windows\Fonts目錄中,複製出arial.ttf,並上傳到CentOS主機中的/usr/share/fonts/lyx目錄下,然後更新字型快取:

 
1 fc-cache

 

更新字型快取後重新檢視字型列表,如果列表中出現了arial.ttf字型檔案則表明字型新增成功。

 

 

重新啟動我們的.net Core專案檢視效果:

 

完美。

四、寫在最後

俗話說,萬事開頭難。現在的.net Core已經走到了2.0這個大版本,回想當年.net Framework也是從2.0這個版本開始有了起色,相信不久的將來榮光終將會降臨於.net Core。

另外,根據Github中的討論,官方版本的System.Drawing庫可能將在.net Core 2.1中被新增支援,盡請期待。

完美 :)