C#開(kāi)發(fā)UWP的時(shí)候如果要實(shí)現(xiàn)高斯模糊效果的話,最好的選擇似乎是微軟的Win2D
但是Win2D太過(guò)龐大了,僅僅是龐大其實(shí)也沒(méi)啥問(wèn)題,畢竟net core就很龐大,但Win2d是一個(gè)Winmd組件
winmd是支持JavaScript這樣的語(yǔ)言的訪問(wèn)的,這意味著編譯器不能優(yōu)化掉你用不到的部分,整個(gè)龐大的win2d必需全部打包到最后的軟件中,光元數(shù)據(jù)就有200kb+,整個(gè)win2d接近1MB+
抱著節(jié)省用戶最終安裝包的大小的目的,我開(kāi)發(fā)了這個(gè)Sharp2D庫(kù)。這是一個(gè)傳統(tǒng)的dll庫(kù),這意味著在.net native編譯時(shí)編譯器可以刪除無(wú)用的代碼
其中在如何返回IPropertyValue對(duì)象的時(shí)候遇到了困難
首先在PropertyValue里創(chuàng)建對(duì)象的話不能得到IPropertyValue,只能得到object,這個(gè)object好像就跟普通的object一樣,轉(zhuǎn)換成IUnknown后QueryInterface也得不到IPropertyValue,使用PropertySet,直接as什么的就更別說(shuō)了,都不行。也試過(guò)自己用COMimport定義IPropertyValue,可惜還是不行。直接返回object也不行,MSDN說(shuō)nullable是IPropertyValue的子類,所以也試過(guò)nullable,錯(cuò)誤都是下圖這樣
寫了一個(gè)C++/CX的winmd組件(這個(gè)組件比win2d的小了不知道多少)來(lái)獲取IPropertyValueStatics的指針,然后用p/invoke獲取數(shù)據(jù),獲取的時(shí)候還是會(huì)訪問(wèn)沖突。
最后在C++的winmd組件里直接從IPropertyValueStatics轉(zhuǎn)換成IPropertyValue傳給C#組件
返回的時(shí)候返回IPropertyValue,IPropertyValue**,IPropertyValue* Comptr<IPropertyValue>都會(huì)提示本機(jī)類型不能在WINMD里當(dāng)公共成員
最后沒(méi)辦法了,都返回int,在C#里轉(zhuǎn)換成IntPtr用。
還有一點(diǎn),就是寫C++ winmd訪問(wèn)Windows命名空間的時(shí)候要加ABI的命名空間前綴,不然(至少我這里)就會(huì)這樣
返回int最后發(fā)現(xiàn)編譯64位的時(shí)候會(huì)提示指針截?cái)?,于是改成返回int64了
差不多就這些了,最后是nuget地址:
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式