AlphaBlend

BOOL AlphaBlend(
HDC hdcDest, // handle to destination DC
int nXOriginDest, // x-coord of upper-left corner
int nYOriginDest, // y-coord of upper-left corner
int nWidthDest, // destination width
int nHeightDest, // destination height
HDC hdcSrc, // handle to source DC
int nXOriginSrc, // x-coord of upper-left corner
int nYOriginSrc, // y-coord of upper-left corner
int nWidthSrc, // source width
int nHeightSrc, // source height
BLENDFUNCTION blendFunction // alpha-blending function
);  
最后一个参数结构定义:
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
函数功能:该函数用来显示具有指定透明度的图像。
  参数:
  hdcDest:指向目标设备环境的句柄。
  nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
  hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
  hdcSrc:指向源设备环境的句柄。
  nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
  nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
  nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
  nHeightSrc:指定源矩形区域的高度,按逻辑单位。
  blendFunction:指定用于源位图和目标位图使用的alpha混合功能,
用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。
   最后一个参数blendFunction是一个BLENDFUNCTION结构。BLENDFUNCTION结构控制源和目标位图的混合方式,
它的BlendOp字段指明了源混合操作,但只支持AC_SRC_OVER,即根据源alpha值把源图像叠加到目标图像上。
OpenGL的alpha混合还支持其他的方式,如常量颜色源。下一个字段BlendFalgs必须是0,也是为以后的应用保留的。
最后一个字段AlphaFormat有两个选择:0表示常量alpha值,AC_SRC_ALPHA表示每个像素有各自的alpha通道。
   如果AlphaFormat字段为0,源位图中的所有像素使用同样的常量alpha值,即SourceConstantAlpha字段中的值,
该值实际上是0和255,而不是0和1。这里0表示完全透明,255表示完全不透明。目标像素以255-SourceConstantAlpha值作为alpha值。
   如果AlphaFormat字段的值是AC_SRC_ALPHA,源设备表面的每个像素必须有各自的alpha通道。
即,必须是32-bpp的物理设备上下文,或是选中了32-bpp DDB和DIB段的内存设备上下文。
这些情况下,每个源像素有4个8位通道:红、绿、蓝和alpha。每个像素的alpha通道和SourceConstantAlpha字段一起用于把源和目标混合起来。
实际用于计算的运算式如下:
  Tmp.Red = Src.Red * SourceConstantAlpha / 255;
  Tmp.Green = Src.Green * SourceConstantAlpha / 255;
  Tmp.Blue = Src.Blue * SourceConstantAlpha / 255;
  Tmp.Alpha = Src.Alpha * SourceConstantAlpha / 255;
  Beta = 255 – Tmp.alpha;
  Dst.Red = Tmp.Red + Round((Beta * Dst.Red )/255);
  Dst.Green = Tmp.Green + Round((Beta * Dst.Green)/255);
  Dst.Blue = Tmp.Blue + Round((Beta * Dst.Blue )/255);
  Dst.Alpha = Tmp.Alpha + Round((Beta * Dst.Alpha)/255);
 返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
  Windows NT:若想获取更多错误信息,请调用GetLastError函数。
 备注:如果源矩形区域与目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。
如果使用SetStretchBltMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,
在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标使用为目标设备环境当前指定的转换方式进行转换。
源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。
如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。
   AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。
 速查:Windows NT:5.0及以上版本、Windows:98及以上版本、Windows CE:5.0及以上版本支持;头文件:wingdi.h;
库文件:作为一个资源包含在msimg32.dll中。

时间: 2024-10-12 15:26:02

AlphaBlend的相关文章

Unresolved external 'AlphaBlend' referenced from

AlphaBlend [Linker Error] Unresolved external 'AlphaBlend' referenced from 解决方案 把文件msimg32.lib添加到工程中再重新编译,链接成功!D:\Program Files\Borland\CBuilder6\Lib\Psdk\msimg32.lib D:\Program Files (x86)\Borland\CBuilder6\Lib\Psdk\msimg32.lib 或者在工程的cpp单元中 #pragma

windows Api AlphaBlend的使用方法

原文链接: http://www.cnblogs.com/sosopop/p/3412962.html 很早的时候公司里开发了个c++客户端软件,需要支持windows2000,要求简单小巧,并且不希望引入其他界面库,图形引擎之类的东西,像gdi+之类的,于是对于美工做出来的一些界面,需要有alpha通道的图片渲染很麻烦,自己写的效率还有些低.于是从msdn找到了alphablend这个函数,来做图像的alpha混合,刚开始的时候,以为这个函数只能够处理整个图片的整体透明度,不能处理32位图像每

图像处理:AlphaBlend混合两张图片

使用vs2017新建一个项目 混合A,B两张图的基础算法: outColor = srcColor * srcAlpha + destColor * (1 - srcAlpha) 输出颜色 = 源颜色 * 源混合因子 + 目标颜色 * ( 1 - 源混合因子 ) 这里scrAlpha从源图的Alpha通道获取 代码如下: // alphablendimg.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <opencv2/op

使用字符串输出图形效果

[cpp] view plaincopy ////////////////////////////////////////////////////////////////// // StringEffect - 字符串效果 // // Author:  木头云 // Blog:    http://blog.csdn.net/markl22222 // E-Mail:  [email protected] // Version: 1.0.1002.1308 ///////////////////

鼠标拖动虚影效果(拖动的时候使用图片蒙人,但效果不错)

疯狂delphi delphiXE7.XE8.XE10公开课A 群号:58592705 鼠标拖动虚影效果 1 //1.定义消息 2 procedure MYHideMessage(var Msg: tagMSG; var Handled: Boolean); 3 4 //2.执行消息 5 procedure TForm2.MYHideMessage(var Msg: tagMSG; var Handled: Boolean); 6 var 7 pt:TPoint; 8 bit: TBitmap;

位图背景透明与设置位图透明度

位图怎么像PNG图片背景透明呢? 关键在于对单色位图的使用,单色位图,黑色表示前景颜色(可代表任意),白色代表图片背景颜色 实现API :Transparentblt来理解单色位图 函数原型:BOOL TransparentBlt(HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int hHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc, int nW

unity3d-绘制贴图

准备贴图 在屏幕在绘制一张静态贴图,需要用到GUI.DrawTexture()方法, 该方法可以设定图片的显示位置.缩放比例和渲染混合等 /* Rect position:表示图片的绘制区域 * Texture image:表示绘制图片的对象 * ScaleMode scaleMode:表示图片的缩放模式 * bool alphaBlend:表示十分开启图片混合模式 * float imageAspect:表示图片的缩放宽高比例 */ public static void DrawTexture

字体函数 -- GetDeviceCaps

函数功能:该函数检索指定设备的设备指定信息. 函数原型:int GetDeviceCaps(HDC hdc, int nlndex): 参数: 1.hdc:设备上下文环境的句柄. 2.nIndex:指定返回项,该参数取下列一值.(C++) DRIVERVERSION:设备驱动程序版本. TECHNOLOGY:设备技术,它可以是下列一值: DT_PLOTTER:矢量绘图仪:DT_RASDISPLAY:光栅显示器: DT_RASPRINTER:光栅打印机:DT_RASCAMERA:光栅照相机: DT

窗体皮肤实现 - 在标题栏上增加快速工具条(四)

前面做的工作就是想在标题区域增加快速工具条.前续的基础工作完成,想要在标题区域增加特殊区域都非常方便.只要在绘制时控制自定义区域需要占用标题区域多少空间,然后直接在所占位置绘制.做这个事情前,稍微把代码规整了下.所以界面皮肤处理放到一个单元中. 主要处理步骤 1.划出一个新区域(整个工具条作为一个区域) 2.处理区域检测(HitTest) 3.如果是新区域,把相应消息传给这个区域处理. 4.响应鼠标点击,执行Action 通过上述步骤就能扩展出所想要的标题区快速工具条的. 标题按钮区域是作为一个