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

  BLENDFUNCTION _blendfunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA };

  但是渲染出来的颜色总是不对.从网上搜索也找不到答案,后来再仔细研究了下msdn,其中有个单词引起了我的注意premultiply, 那什么是预乘alpha值呢.我们先看一下alpha混合的公式:

  Color = ( SrcRGB * SrcAlpha ) + ( DestRGB * ( 1 - SrcAlpha ) )

  其中( SrcRGB * SrcAlpha )这一步是在渲染,或者加载之前就可以计算出来的,图像重新刷新渲染的时候,可以直接使用已经计算好的预乘alpha数值,而不用计算这一步乘法,从而加渲染速度.因此普通包含alpha通道的图像需要做特殊处理才可以使用alphablend渲染到dc.

  那怎样将图像预乘alpha的图像在渲染前准备好呢?一种是在加载完图像后遍历每一个像素,进行alpha预乘运算.还有一种是让美工直接输出已经预乘完毕的alpha图像.第一种方式程序员都会,第二种方式呢,可能程序员和美工都不知道怎么弄,这里讲一下第二种方式吧,上图.

首先加载带alpha信息的png,或者自己设计的psd

将图层复制一个新的

选择刚刚复制的图层,按ctrl+u,调整明度到100,确定后全选并复制.

在通道面板新建一个通道,然后将刚才复制的白苹果粘贴到这个新建的通道上

返回图层面板,删除掉图层面板里的白苹果,并在彩色苹果下面新建一个图层,并填充成黑色.

另存为bmp图像,色彩深度选择32位,这样我们就做好了预乘alpha的图像.

这是一个简单的例子代码.

http://pan.baidu.com/s/11j9OJ

windows Api AlphaBlend的使用方法的更多相关文章

  1. C#调用windows API的一些方法

    使用C#调用windows API(从其它地方总结来的,以备查询) C#调用windows API也可以叫做C#如何直接调用非托管代码,通常有2种方法: 1.  直接调用从 DLL 导出的函数. 2. ...

  2. VC Windows API获得桌面所有窗口句柄的方法

    VC Windows API应用之GetDesktopWindow ——获得桌面所有窗口句柄的方法 Windows API Windows 这个多作业系统除了协调应用程序的执行.分配内存.管理资源…之 ...

  3. Delphi Windows API判断文件共享锁定状态(OpenFile和CreateFile两种方法)

    一.概述 锁是操作系统为实现数据共享而提供的一种安全机制,它使得不同的应用程序,不同的计算机之间可以安全有效地共享和交换数据.要保证安全有效地操作共享数据,必须在相应的操作前判断锁的类型,然后才能确定 ...

  4. Windows API Hooking in Python

    catalogue . 相关基础知识 . Deviare API Hook Overview . 使用ctypes调用Windows API . pydbg . winappdbg . dll inj ...

  5. 在VBA中使用Windows API

    VBA是一种强大的编程语言,可用于自定义Microsoft Office解决方案.通过使用VBA处理一个或多个Office应用程序对象模型,可以容易地修改Office应用程序的功能或者能够使两个或多个 ...

  6. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  7. 在Linux下和Windows下遍历目录的方法及如何达成一致性操作

    最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了.在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件 ...

  8. 【转】用C#调用Windows API向指定窗口发送

    一.调用Windows API. C#下调用Windows API方法如下: 1.引入命名空间:using System.Runtime.InteropServices; 2.引用需要使用的方法,格式 ...

  9. 学习之路三十九:新手学习 - Windows API

    来到了新公司,一开始就要做个程序去获取另外一个程序里的数据,哇,挑战性很大. 经过两周的学习,终于搞定,主要还是对Windows API有了更多的了解. 文中所有的消息常量,API,结构体都整理出来了 ...

随机推荐

  1. Android操作联系人 android开发教程

    Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人.通过电话号码获取联系人.添加联系人.使用事务添加联系人. 获取所有联系人 1. Andr ...

  2. Mongodb集群配置(sharding with replica set)

    转自:http://blog.csdn.net/zhangzhaokun/article/details/6269514 前言 最近在研习MongoDB集群,找到一个不错的例子,加了几句,按照自己的理 ...

  3. 汉化Eclipse+配色方法(官方语言包)

    一. 汉化方法: 1.Eclipse版本查询:安装目录readme,查版本号;参照查代号如下表: 代号 平台版本 项目 主要版本发行日期 SR1发行日期 SR2发行日期 N/A 3.0 [1] N/A ...

  4. JS比较两个数值大小的正确方法

    转自:http://www.zzsky.cn/build/content/1832.htm 一般情况下: <script type="text/javsscript"> ...

  5. [vba]excel中求选中数据和为给定数所有的组合

    昨天下午开始学习的vba,累死了,肯定有bug,待调试 vba程序如下: Dim aSum As Integer Dim tSum As Integer ) As Integer Dim arrMax ...

  6. 终端I/O之获得和设置终端属性

    使用函数tcgetattr和tcsetattr可以获得或设置termios结构.这样也可以检测和修改各种终端选择标志和特殊字符,以使终端按我们所希望的方式进程操作. #include <term ...

  7. 二分查找实现(Jon Bentley:90%程序员无法正确实现)

    二分查找实现(Jon Bentley:90%程序员无法正确实现)作者:July出处:结构之法算法之道引言Jon Bentley:90%以上的程序员无法正确无误的写出二分查找代码.也许很多人都早已听说过 ...

  8. 20条IPTables防火墙规则用法!

    导读 管理网络流量是系统管理员必需处理的最棘手工作之一,我们必需规定连接系统的用户满足防火墙的传入和传出要求,以最大限度保证系统免受攻击.很多用户把 Linux 中的 IPTables 当成一个防火墙 ...

  9. docker + swarm 集群

    docker + swarm 集群 导读 Swarm是Docker公司在2014年12月初新发布的容器管理工具.和Swarm一起发布的Docker管理工具还有Machine以及Compose.Swar ...

  10. Apache的编译安装error: APR not found. Please read the documentation

    提示configure: error: APR not found. Please read the documentation. 经网上查阅资料才知道这是Apache的关联软件 在apr.apach ...