今天有人在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开发