博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET CF 下的Alpha混合

Posted on 2009-09-21 15:20  春之痕  阅读(1258)  评论(4编辑  收藏  举报
      本文翻译自Alphablending with NETCF,一篇老文章,仅是为了方便自己的学习,翻译水平有限,请英文好的网友阅读原文。译文如下:

  当Compact Framework 1.0推出不久,我们开始质疑为何在Compact Framework上不支持桌面Framework版本上拥有(或缺少的)的高级图形和绘图功能。在1.0版本,考虑到大小和性能,我们实现了WindowsCE/PocketPC/Smartphone上的System.Windows.Forms和System.Drawing的本地功能。既然在这些平台上没有GDI+,System.Drawing局限于GDI(实际上是GWES)功能,并且缺少了很多已经相当成熟的特性,比如图像旋转和坐标缩放(以及其它)。

  然而,Windows Mobile 5.0的推出让我们有理由感到欣喜:alpha blending。这个功能可以用一些有趣的效果来装饰一个应用程序。

  简而言之,在WM5里,有两种方法应用alpha混合:AlphaBlend()功能和Imaging APIImage COM对象。

  首先介绍的是AlphaBlend()。

  AlphaBlend功能可以在整个源图上进行常数alpha混合,或者在位图上通过alpha通道进行像素级别的混合。不幸的是,NETCF上的位图装载器在从像素格式的位图文件或者资源中创建一个位图对象进行显示时,丢失了alpha通道的信息(如果原图存在alpha通道),这就意味着Alpha混合功能只能对图象使用常数alpha混合。

  以下是基于p/invoke调用的alpha混合的一组声明:

Code


  以下是一个例子,代码构建于覆写的OnPaint()里:

Code


  下面介绍Imaging API的Image对象(或者IImage接口)

  如果我们实例化一个IImagingFactory并用它从文件或资源装载一个图像,alpha通道将被同时装载。然后我们能够调用Imaging对象来绘制它自身,它将在图像呈现的时候使用alpha通道信息。

  以下是COM接口和枚举的声明:

Code


  以下是怎样从文件装载一个图像:

Code


  以下是怎样从内嵌资源装载一个图像:

Code


  以下是怎样在OnPaint()中呈现图像:

Code


  我已经附加了一个简单的基于VS 2005的WM5 PocketPC项目,其中包括几个图像(两个带alpha数据的.PNGs),用于验证使用AlphaBlend()和Imaging API功能。请注意设备上的alpha混合没有使用硬件加速,所以请谨慎使用此功能,并留意图像呈现时性能方面的影响。

  附件:AlphaExample.zip

Published Friday, April 07, 2006 7:40 AM by clort