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

2 篇文章 0 订阅

今天有人在QQ群里问GDI能不能支持带alpha通道的线条绘制?
大家的答案当然是否定的,很多人推荐用GDI+。

一个基本的图形引擎要包括几个方面的支持:位图绘制,文字绘制,矢量绘制(如矩形,线条)。
可惜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开发。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值