alphablend函数(如何基于纯GDI实现alpha通道的矢量和文字绘制)

2026-04-06 06:15:01 :0

alphablend函数(如何基于纯GDI实现alpha通道的矢量和文字绘制)

本篇文章给大家谈谈alphablend函数,以及如何基于纯GDI实现alpha通道的矢量和文字绘制对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录

如何基于纯GDI实现alpha通道的矢量和文字绘制

一个基本的图形引擎要包括几个方面的支持:位图绘制,文字绘制,矢量绘制(如矩形,线条)。
可惜GDI这个20多年前发明的老古董,对这几项的绘制, 除了位图绘制可以通过AlphaBlend支持alpha通道,其他绘制都不支持alpha通道。
那有没有方法让能通过纯GDI让文字和矢量的绘制也支持alpha通道呢?
讨论这个问题之前,我们先看一下用GDI函数在支持alpha通道的DC上绘制会发生什么? 这里 有人讨论过这个问题。
当然我们也可以自己测试,测试结果是GDI函数会把绘制覆盖目标像素的alpha通道改都改成0, 也 就是说如果画一条线条, 线条通过的位置的alpha通道都回被改成0。
实际上我们可以利用系统的这个特性,结合AlphaBlend函数实现alpha通道的文字和矢量图形绘制。
具体做法大概如下:
1. 创建内存DC和一幅32bit的DIB Section, 将位图选入DC
2. 将位图的所有字节全都改成0xFF
3. 在内存DC上用文字和矢量 GDI函数 (如DrawText, Rectangle)绘制东西
4. 遍历所有像素,发现alpha通道为0 (表示该区域被绘制过),则将 alpha通道改成我们需要的alpha值;否则,则将像素的alpha通道改成0 (表示没有内容绘制上去)
5. 最后通过AlphaBlend将生成好的DIB Section合成绘制到目标区域
通过上面这种方法, 我们可以实现带alpha通道的矢量和文字绘制,我猜测GDI+应该也是通过类似这种修改像素的方法实现的。
当然,这种方法因为效率问题, 建议一些简单的绘制可以考虑 (如果不想引入GDI+), 如果大规模应用就要仔细斟酌了。
微软当初引入GDI+,部分原因就是因为GDI不支持alpha通道,可惜GDI+的效率是如此臭名昭著, 大家大部分时候都是尽量避免引入,很多时候我们引入GDI+只是为了使用它的图像编解码功能。
还好技术总是不断进步,如果你的程序不用考虑XP(现在看来还要过几年), Vista之后系统为我们提供了高效的图形支持:
图像编解码可以用WIC,文字操作可以用DirectWrite,图形渲染可以用Direct2D (既支持alpha通道,又支持GPU加速), 实际上IE9之后的浏览器都已采用Direct2D开发。

求API中AlphaBlend函数使用示例

1 AlphaBlend
函数功能:该函数用来显示透明或半透明像素的位图。
函数原型:AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunction);
参数:
hdcDest:指向目标设备环境的句柄。
nXoriginDest:指定目标矩形区域左上角的X轴坐标,按逻辑单位。
nYOriginDest:指定目标矩形区域左上角的Y轴坐标,按逻辑单位。
nWidthDest:指定目标矩形区域的宽度,按逻辑单位。
hHeghtdest:指向目标矩形区域高度的句柄,按逻辑单位。
hdcSrc:指向源设备环境的句柄。
nXOriginSrc:指定源矩形区域左上角的X轴坐标,按逻辑单位。
nYOriginSrc:指定源矩形区域左上角的Y轴坐标,按逻辑单位。
nWidthSrc:指定源矩形区域的宽度,按逻辑单位。
nHeightSrc:指定源矩形区域的高度,按逻辑单位。
blendFunction:指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER。
返回值:如果函数执行成功,那么返回值为TRUE;如果函数执行失败,那么返回值为FALSE。
Windows NT:若想获取更多错误信息,请调用GetLastError函数。
备注:如果源矩形区域与目标矩形区域大小不一样,那么将缩放源位图与目标矩形区域匹配。如果使用SetStretchBltMode函数,那么iStretchMode的值是BLACKONWHITE和WHITEONBLACK,在本函数中,iStretchMode的值自动转换成COLORONCOLOR。目标坐标使用为目标设备环境当前指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。
AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。
注意添加 #pragma comment(lib,"Msimg32.lib")库
下面是一个例子:
#include 《windows.h》
#pragma comment(lib,"Msimg32.lib")
HINSTANCE g_hIns;
HWND g_hWnd;
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
{
g_hIns=hInstance;
static TCHAR szAppName=TEXT("HelloWin");
HWND hWnd;
MSG msg;
WNDCLASS wndClass;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hInstance;
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName=szAppName;
if(!RegisterClass(&wndClass))
{
MessageBox(NULL,TEXT("error"),szAppName,MB_ICONERROR|MB_OK);
return 0;
}
hWnd=CreateWindow(szAppName,TEXT("The hello program"),WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);
int iReturn;
//也可以放在此
ShowWindow(hWnd,iCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,hWnd,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static HDC hdc;
static HDC hBitmapDC;
static HBITMAP hBitmap;
static int w=50;
static int h=50;
static BLENDFUNCTION bf;
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT :
hdc=BeginPaint(hWnd,&ps);
hBitmapDC = CreateCompatibleDC(hdc);
hBitmap = CreateCompatibleBitmap(hdc,w,h);
SelectObject(hBitmapDC,hBitmap);
SetTextColor(hBitmapDC,RGB(0,255,0));
TextOut(hBitmapDC,0,0,TEXT("asdf"),4);
bf.BlendOp = AC_SRC_OVER;
bf.BlendFlags = 0;
bf.AlphaFormat = 0;
bf.SourceConstantAlpha = 50;
AlphaBlend(hdc,0,0,w,h,hBitmapDC,0,0,w,h,bf);
EndPaint (hWnd, &ps) ;
break;
case WM_DESTROY :
PostQuitMessage (0) ;
break ;
default:
return DefWindowProc (hWnd, message, wParam, lParam) ;
}
return 1;
}

VB alpha值是什么

很简单,使用GDI的AlphaBlend函数就可以。可以设置全局Alpha混合系数(0到255),也可以混合带有Alpha通道的32位BMP。
如果要做稍复杂的处理,可以使用GDI+,里面的所有绘图手段都支持Alpha通道。
附AlphaBlend函数在VB中的声明:
Public Type t_BLENDFUNCTION
BlendOp As Byte
BlendFlags As Byte
SourceConstantAlpha As Byte
AlphaFormat As Byte
End Type
Public Declare Function AlphaBlend Lib "msimg32" (ByVal hDestDC As Long, _
ByVal xDest As Long, _
ByVal yDest As Long, _
ByVal nWidthDest As Long, _
ByVal nHeightDest As Long, _
ByVal hSrcDC As Long, _
ByVal xSrc As Long, _
ByVal ySrc As Long, _
ByVal nWidthSrc As Long, _
ByVal nHeightSRC As Long, _
ByVal BLENDFUNCTION As Long) As Long

我发现 WINAPI 里面的 alphablend()函数不能用啊

查了一下MSDN,但是也不知道问题到底是在哪里
The AlphaBlend function displays bitmaps that have transparent or semitransparent pixels.
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
);
Requirements
Windows NT/2000/XP: Included in Windows 2000 and later.
Windows 95/98/Me: Included in Windows 98 and later.
Header: Declared in Wingdi.h; include Windows.h.
Library: Included as a resource in Msimg32.dll.
看Requirements
应该#include Windows.h就可以了。因为你这个是编译错。

关于本次alphablend函数和如何基于纯GDI实现alpha通道的矢量和文字绘制的问题分享到这里就结束了,如果解决了您的问题,我们非常高兴。

alphablend函数(如何基于纯GDI实现alpha通道的矢量和文字绘制)

本文编辑:admin

更多文章:


servlet和dao层之间的关系(java mysql中的 dao bean servlet util filter 文件都是干什么的它们之间有什么联系)

servlet和dao层之间的关系(java mysql中的 dao bean servlet util filter 文件都是干什么的它们之间有什么联系)

大家好,今天小编来为大家解答以下的问题,关于servlet和dao层之间的关系,java mysql中的 dao bean servlet util filter 文件都是干什么的它们之间有什么联系这个很多人还不知道,现在让我们一起来看看吧

2025年9月14日 20:00

海报免费制作app(手机什么软件做海报手机海报制作app哪个好免费)

海报免费制作app(手机什么软件做海报手机海报制作app哪个好免费)

本篇文章给大家谈谈海报免费制作app,以及手机什么软件做海报手机海报制作app哪个好免费对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录手机什么软件做海报手机海报制作app哪个好免费免费设计海报app有哪些有什么好的制作海报的

2025年12月22日 23:45

shell编程用户信息管理(利用Linux系统Shell命令编写脚本实现对用户行为的监控和审计功能. 求大神怎么写啊)

shell编程用户信息管理(利用Linux系统Shell命令编写脚本实现对用户行为的监控和审计功能. 求大神怎么写啊)

大家好,关于shell编程用户信息管理很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于利用Linux系统Shell命令编写脚本实现对用户行为的监控和审计功能. 求大神怎么写啊的知识点,相信应该可以解决大家的一些困惑和问题,如

2026年7月27日 00:15

macosmojave下载(如何升级mac系统版本)

macosmojave下载(如何升级mac系统版本)

各位老铁们,大家好,今天由我来为大家分享macosmojave下载,以及如何升级mac系统版本的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录如何升

2026年9月2日 01:15

latter与later区别(later和latter有什么不同)

latter与later区别(later和latter有什么不同)

今天给各位分享later和latter有什么不同的知识,其中也会对later和latter有什么不同进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录later和latter有什么不同late later

2025年12月6日 19:00

eclipse运行窗口放大(怎么把eclipse的字体调大)

eclipse运行窗口放大(怎么把eclipse的字体调大)

本篇文章给大家谈谈eclipse运行窗口放大,以及怎么把eclipse的字体调大对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录怎么把ecl

2025年9月7日 12:00

易语言官网为啥下载安装不了(易语言已经下载安装破解补丁,为啥生不成安装软件)

易语言官网为啥下载安装不了(易语言已经下载安装破解补丁,为啥生不成安装软件)

其实易语言官网为啥下载安装不了的问题并不复杂,但是又很多的朋友都不太了解易语言已经下载安装破解补丁,为啥生不成安装软件,因此呢,今天小编就来为大家分享易语言官网为啥下载安装不了的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析

2026年5月5日 04:15

timezone官网(华为时区更新已完成是啥意思)

timezone官网(华为时区更新已完成是啥意思)

本篇文章给大家谈谈timezone官网,以及华为时区更新已完成是啥意思对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录华为时区更新已完成是啥

2026年6月1日 04:30

e和ln的转换公式(ln与e之间的公式)

e和ln的转换公式(ln与e之间的公式)

大家好,今天小编来为大家解答以下的问题,关于e和ln的转换公式,ln与e之间的公式这个很多人还不知道,现在让我们一起来看看吧!本文目录ln与e之间的公式e和ln之间的换底公式是ln是怎么转化成e的e和ln之间的转换公式大全ln的运算法则和e

2025年11月29日 22:30

如何为孩子选择一款合适的书包?描写书包作文200字

如何为孩子选择一款合适的书包?描写书包作文200字

各位老铁们,大家好,今天由我来为大家分享第二书包,以及如何为孩子选择一款合适的书包的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目录如何为孩子选择一款

2026年5月8日 10:00

源代码经典台词中英(模仿游戏中比较经典的台词,中英文都要哦)

源代码经典台词中英(模仿游戏中比较经典的台词,中英文都要哦)

大家好,如果您还对源代码经典台词中英不太了解,没有关系,今天就由本站为大家分享源代码经典台词中英的知识,包括模仿游戏中比较经典的台词,中英文都要哦的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录模仿游戏中比较经典的

2025年6月12日 22:15

宕机是什么意思?redis中的宕机什么意思

宕机是什么意思?redis中的宕机什么意思

大家好,关于宕机很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于宕机是什么意思的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本文目录宕机是什么意思redis中

2026年1月14日 14:15

js代码在线加密(如何操作nodejs对密码进行加密)

js代码在线加密(如何操作nodejs对密码进行加密)

各位老铁们好,相信很多人对js代码在线加密都不是特别的了解,因此呢,今天就来为大家分享下关于js代码在线加密以及如何操作nodejs对密码进行加密的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录如何操作nodej

2026年9月5日 04:00

fscan工具(fscan禁止ping扫描)

fscan工具(fscan禁止ping扫描)

大家好,今天小编来为大家解答以下的问题,关于fscan工具,fscan禁止ping扫描这个很多人还不知道,现在让我们一起来看看吧!本文目录fscan禁止ping扫描渗透测试用什么工具好呢支持udp扫描软件有fscanfscan使用报错fsc

2026年5月1日 21:15

no such file or directory怎么解决(No such file or directory怎么解决)

no such file or directory怎么解决(No such file or directory怎么解决)

“no such file or directory怎么解决”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看no such file or directory怎么解决(No such file or directory怎么解

2025年8月1日 03:45

java算法视频教程(求实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划、HashTable算法)教学视频)

java算法视频教程(求实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划、HashTable算法)教学视频)

本篇文章给大家谈谈java算法视频教程,以及求实战应用Java算法分析与设计(链表、二叉树、哈夫曼树、图、动态规划、HashTable算法)教学视频对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有

2025年7月4日 00:15

mvc模式和责任链(网站开发模式除了MVC外还有什么)

mvc模式和责任链(网站开发模式除了MVC外还有什么)

这篇文章给大家聊聊关于mvc模式和责任链,以及网站开发模式除了MVC外还有什么对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录网站开发模式除了MVC外还有什么软件设计模式主要有哪几种mvc开发模式java 除了mvc设计模式

2025年9月13日 21:00

centos7下载官网(正在安装Linux系统的CentOS 7到这一步了)

centos7下载官网(正在安装Linux系统的CentOS 7到这一步了)

“centos7下载官网”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看centos7下载官网(正在安装Linux系统的CentOS 7到这一步了)!本文目录正在安装Linux系统的CentOS 7到这一步了centos7怎

2026年3月4日 01:15

微服务必须用docker吗(微服务为什么要选择docker)

微服务必须用docker吗(微服务为什么要选择docker)

各位老铁们,大家好,今天由我来为大家分享微服务必须用docker吗,以及微服务为什么要选择docker的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文目

2025年7月29日 21:15

onclick可以调用两个方法吗(java脚本中同一按钮当点击时能同时执行两个函数吗)

onclick可以调用两个方法吗(java脚本中同一按钮当点击时能同时执行两个函数吗)

“onclick可以调用两个方法吗”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看onclick可以调用两个方法吗(java脚本中同一按钮当点击时能同时执行两个函数吗)!本文目录java脚本中同一按钮当点击时能同时执行两个函

2025年7月13日 16:15

近期文章

conduct well behave well(behaviour 和behavior有什么区别)
2026-09-25 03:00:02
本站热文

electronics软件(labcenter electronics是什么软件)
2025-05-22 23:45:02 浏览:134
博客是微博吗(博客是微博吗)
2025-05-22 22:45:01 浏览:111
diversity and distribution(悬赏英语短文)
2025-05-23 16:15:02 浏览:107
ios软件开发前景(iOS就业前景怎么样)
2025-05-22 23:00:01 浏览:102
next month(有The next month这个单词吗,和 next month有什么区别)
2025-05-23 02:30:01 浏览:102
patron(patron是什么意思)
2025-05-23 10:30:02 浏览:95
标签列表

热门搜索