类CImage,头文件atlimage.h
1.显示背景透明的PNG图片
CImage m_Image;
m_Image.Load(图片路径);//装载图片
for(int i = 0; i < m_Image.GetWidth(); i++)
{
}
m_Image.Draw(...)显示图片
BOOL CImage::Draw( HDC hDestDC, int xDest, int yDest, int nDestWidth,
2.显示整体半透明PNG图片
BOOL CImage::AlphaBlend( HDC hDestDC, int xDest, int yDest,
bSrcAlpha=255表示图片整体不透明
bSrcAlpha=0表示整体透明
备注:
typedef struct _BLENDFUNCTION {
BlendOp:为AC_SRC_OVER
BlendFlags:为保留项,为0
SourceConstantAlpha:为图片整体的不透明度,如果要使用图片像素自身的Alpha值,则要将这个参数设置为255
AlphaFormat:如果使用SourceConstantAlpha作为描画图片的整体不透明度,则为设置为0,如果使用图片像素自身的Alpha值,则设置为AC_SRC_ALPHA.将AlphaFormat设置为AC_SRC_ALPHA.MSDN对这种情况下颜色混合的计算方法作了描述,如下:
Dst.Red = Src.Red + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue + (1 - Src.Alpha) * Dst.Blue
Src是指我们要描画的图片,Dst是指目标DC的上下文,Src.Alpha应该不是像素的Alpha值,而应该是Alpha/255;按照这个公式,我们可以举个例子计算一下:Src上一个像素为RGB(255, 255, 255),Alpha值为0,与之混合的Dst上相应像素为RGB(128, 128, 128),混合后得出的结果为:
R = 255 + (1 - 0 / 255) * 128;
G = 255 + (1 - 0 / 255) * 128;
B = 255 + (1 - 0 / 255) * 128;
计算结果大于255,函数内部自动将其设置为255,最后为RGB(255, 255, 255),仍然为白色.而当Src中像素的颜色为RGB(0, 0, 0),则结果为Dst的颜色RGB(128, 128, 128),实现了透明效果.按照这个公式计算,很多颜色的半透明或透明效果都无法实现.
参考MSDN上在SourceConstantAlpha不等于255时的混合计算公式,我们可以将公式修改为
view plaincopy to clipboardprint?
Dst.Red = Src.Red * Src.Alpha + (1 - Src.Alpha) * Dst.Red
Dst.Green = Src.Green * Src.Alpha + (1 - Src.Alpha) * Dst.Green
Dst.Blue = Src.Blue * Src.Alpha + (1 - Src.Alpha) * Dst.Blue