精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>未整理到对应目录的文章>>透明图象及Alpha混合的简单实现。

主题:透明图象及Alpha混合的简单实现。
发信人: forfar(别离歌)
整理人: yangcs(2004-10-14 14:22:35), 站内信件
在应用程序中引入图片淡入及淡出,可以让用户界面更加美观。 以前报刊杂志中介绍的常用方法有两种:一是自己写程序,逐个象素进行混合渐变;二是使用DirectX,建立一个带Alpha通道的Surface。 

第一种,效果可以自己控制,但比较麻烦,而且一般不容易生成硬件优化的代码; 
第二种速度很快,却需要使用DirectX库。其实在Windows的GDI中已经提供了一个很好的API――AlphaBlend,既保证速度又很简单。 


function AlphaBlendA(DestDC: HDC; TopDest, LeftDest, WidthDest, HeightDest: Integer; SrcDC: HDC; TopSrc, LeftSrc, WidthSrc, HeightSrc: Integer; BlendFunction: TBlendFunction): BOOL; stdcall; // API函数声明 

  
其中DestDC参数是生成画面的Handle,TopDest, LeftDest, WidthDest, HeightDest是生成画面的右上角坐标和长宽值;SrcDC, TopSrc, LeftSrc, WidthSrc, HeightSrc表示原图的相关参数,因为AlphaBlend会自动处理缩放,所以WidthDest, Height, LeftSrc, WidthSrc可以为不同值;DestBlendFunction是控制 Alpha 混合的结构。 
DestBlendFunction这个结构,是AlphaBlend的使用中最重要的参数,它的定义如下: 
typedef struct _BLENDFUNCTION 

BYTE BlendOp; 
BYTE BlendFlags; 
BYTE SourceConstantAlpha; 
BYTE AlphaFormat; 
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION; 

BlendOP是混合方式,当前只有AC_SRC_OVER一种,即将SrcDC放置于DstDC之上,进行混合; 
BlendFlags必须为零,为什么呢?M$没有告诉我们。 
SourceConstantAlpha控制SrcDC画面的透明度,为0时,完全透明;为255时,完全不透明,其间逐渐变化。 
AlphaFormat表示SrcDC和DstDC的格式,缺省为零,一般不用指定。 


利用AlphaBlend还可以产生其它图象效果,比如将SourceConstantAlpha适当居中,能象PhotoShop一样出现“浮雕”的效果等。 

在msimg32.dll中,除了AlphaBlend,还有TransparentBlt和GradientFill等很有用的API:TransparentBlt可以快速处理16色和256色的透明贴图(AlphaBlend可以处理32位色),以前有些文章建议不要在WIN98下使用,说会引起“资源泄露”,我想可能是因为它不支持32位色的缘故;GradientFill则能够借助硬件加速,产生颜色渐变的三角形或矩形,利用上它们,将会让你编写的程序更加吸引人。 

msimg32.dll中应该还有其他很有用的函数,但M$既然保密,我们也无从可知,要是有哪位大侠知道,欢迎一起贴出来分享。

[关闭][返回]