很早的时候公司里开发了个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. C# GDI在控件上绘图

    本文以以在chart控件上和窗体上画矩形为例子 不多解释了,代码很简单. 还有一些童鞋要别的源码,给我发邮箱吧 using System; using System.Collections.Gener ...

  2. HDU 4336 Card Collector 数学期望(容斥原理)

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意简单,直接用容斥原理即可 AC代码: #include <iostream> ...

  3. linux C 9*9

    #include<stdio.h> #include<conio.h> #include <windows.h> void Gotoxy(int x, int y) ...

  4. TP复习12

    四.特殊标签 1.比较标签 eq或者 equal 等于 neq 或者notequal 不等于 gt 大于 egt 大于等于 lt 小于 elt 小于等于 heq 恒等于 nheq 不恒等于 2.范围标 ...

  5. ios实例开发精品源码文章推荐

    iOS源码:游戏引擎-推箱子游戏 http://www.apkbus.com/android-106392-1-11.html iOS源码:进度条-Colorful ProgressView http ...

  6. 已解决】Sublime中运行带input或raw_input的Python代码出错:EOFError: EOF when reading a line(转)

    [问题] 在折腾: [已解决]Sublime Text 2中运行Python程序出错:The system cannot find the file specified 的过程中,虽然解决了找不到py ...

  7. JB开发之二 [jailbreak,越狱开发研究]

    1.更换壁纸:把图片写到这个目录,/var/mobile/Library/LockBackground.jpg,然后kill the Springboard. 2.把程序添加进通知中心(iOS5以上) ...

  8. ls 显示目录和文件的技巧

    摘自 http://hi.baidu.com/zaoyuan1217/blog/item/fd69575660366b4fd10906b9.html 要列出当前目录下所有的文件名和目录名直接使用ls命 ...

  9. 远程MSMQ

    简介 MSMQ(微软消息队列)是Windows操 作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具.消息队列和电子邮件有着很多相似处,他们都包含多个属性,用于保存消息 ...

  10. jsp包含的讲解

    <%@page language="java" import="java.util.*" pageEncoding="UTF-8"%& ...