C#开发UWP的时候如果要实现高斯模糊效果的话,最好的选择似乎是微软的Win2D

但是Win2D太过庞大了,仅仅是庞大其实也没啥问题,毕竟net core就很庞大,但Win2d是一个Winmd组件

winmd是支持JavaScript这样的语言的访问的,这意味着编译器不能优化掉你用不到的部分,整个庞大的win2d必需全部打包到最后的软件中,光元数据就有200kb+,整个win2d接近1MB+

抱着节省用户最终安装包的大小的目的,我开发了这个Sharp2D库。这是一个传统的dll库,这意味着在.net native编译时编译器可以删除无用的代码

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

 

其中在如何返回IPropertyValue对象的时候遇到了困难

首先在PropertyValue里创建对象的话不能得到IPropertyValue,只能得到object,这个object好像就跟普通的object一样,转换成IUnknown后QueryInterface也得不到IPropertyValue,使用PropertySet,直接as什么的就更别说了,都不行。也试过自己用COMimport定义IPropertyValue,可惜还是不行。直接返回object也不行,MSDN说nullable是IPropertyValue的子类,所以也试过nullable,错误都是下图这样

 

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

 

写了一个C++/CX的winmd组件(这个组件比win2d的小了不知道多少)来获取IPropertyValueStatics的指针,然后用p/invoke获取数据,获取的时候还是会访问冲突。

最后在C++的winmd组件里直接从IPropertyValueStatics转换成IPropertyValue传给C#组件

返回的时候返回IPropertyValue,IPropertyValue**,IPropertyValue* Comptr<IPropertyValue>都会提示本机类型不能在WINMD里当公共成员

最后没办法了,都返回int,在C#里转换成IntPtr用。

还有一点,就是写C++ winmd访问Windows命名空间的时候要加ABI的命名空间前缀,不然(至少我这里)就会这样

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

Android培训,安卓培训,手机开发培训,移动开发培训,云培训培训

返回int最后发现编译64位的时候会提示指针截断,于是改成返回int64了

 

差不多就这些了,最后是nuget地址:

延伸阅读

学习是年轻人改变自己的最好方式-Java培训,做最负责任的教育,学习改变命运,软件学习,再就业,大学生如何就业,帮大学生找到好工作,lphotoshop培训,电脑培训,电脑维修培训,移动软件开发培训,网站设计培训,网站建设培训学习是年轻人改变自己的最好方式