首页 > 其他分享 >绘制一张透明背景的单色位图

绘制一张透明背景的单色位图

时间:2022-12-31 10:34:42浏览次数:35  
标签:透明 方法 背景 像素 背景色 操作 单色 绘制


在上一篇文章中,我留下了一个谜题:如何使用透明背景绘制一张单色位图。今天我们来揭晓谜底。

丑话说前头,我不是一名 GDI 方面的专家,所以,除了下面讲述的两种方法之外,可能还有我所不知道的更好的解决方案。为了演示透明背景的效果,我先将窗口的背景色设置成工作区颜色。

绘制一张透明背景的单色位图_windows

方法1:采用 MaskBlt API

绘制一张透明背景的单色位图_windows_02

上面的方法所需要编写的代码量最少,但我个人觉得有些矫枉过正了。它使用一个所谓的四元光栅操作,就好像是三元一样,只是因为我不想额外再创建一个图案画刷。(光栅操作 0x00AA0029 实际上是一个空操作(NOP)运算符,它不对目标区域做任何操作,我并没有特别记住它,而是通过查阅文档知道的)
MAKEOP4 这个宏的意思是:对于蒙版中所有的白色像素,不执行任何操作(NOP),而对于每一个黑色像素,执行 SRCCOPY 操作。

请注意,背景色一直都没有被使用,毕竟我们是准备绘制一个透明背景的位图。因此,我们可以直接删除掉设置和恢复 DC 背景色的相关代码。

方法2:传统的二步式

绘制一张透明背景的单色位图_软件开发_03

这是传统的两步走方案。第一种方法通过将前景设置为黑色,将背景设置为白色,然后使用 SRCAND 来擦除即将被覆盖的像素。这具有将所有前景像素擦除为零的效果,同时保持背景完好无损。第二个blit做同样的事情,但使用SRCPAINT。这意味着背景像素需要被视为黑色,以便当它们与目标“或”时,目标像素保持不变。前景色像素获得所需的前景色。

此方法可以通过否定第一个 blit 来缩短,反转前景和背景感,这样黑色就不必在背景颜色和文本颜色之间移动。

绘制一张透明背景的单色位图_windows_04

这种缩短是否真的是一种整体改进很难说。某些显示驱动程序可能具有高度优化的 SRCAND 处理程序,而它们不太可能具有优化的0x00220326处理程序。

(练习:为什么你不能反转第二个步骤,将其转换为MERGEPAINT?)

总结

细枝末节,我的最爱!

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。

绘制一张透明背景的单色位图_软件开发_05

标签:透明,方法,背景,像素,背景色,操作,单色,绘制
From: https://blog.51cto.com/u_15805075/5981997

相关文章

  • 绘制菜单符号的技法
    在上一篇文章中,我们了解了如何绘制主题化的和原始未主题化的单选按钮,我曾提到,绘制菜单符号会更加复杂一些。复杂之处在于,这些符号是通过单色位图实现的,而不是漂亮的全彩色位......
  • #yyds干货盘点# LeetCode程序员面试金典:绘制直线
    题目:已知一个由像素点组成的单色屏幕,每行均有 w​ 个像素点,所有像素点初始为 0​,左上角位置为 (0,0)。现将每行的像素点按照「每 32​ 个像素点」为一组存放在一个 i......
  • PS教程!教你五分钟快速绘制大气磅…
    我也不知道这种中国风​​字体设计​​Banner什么时候火爆起来。我觉得首先应该感谢淘宝,每当淘宝大促的时候必然有很多这样的风格的Banner充斥着你的眼球。有非常强烈的视觉......
  • VTK_Learning_体绘制讨论_颜色传输函数
    1.颜色传输函数颜色传输函数与不透明度传输函数的使用类似,二者的不同之处在于颜色传输函数是将一个标量值映射为颜色值。这个颜色值可以是RGB值,也可以是HSV值。VTK颜色传输......
  • VTK_Learning_体绘制讨论_光照&阴影、VTKLODProp3D
    1.光照与阴影通过VTKVolumeProperty可以设置体绘制阴影效果(Shading)。阴影效果主要受环境光系数、散射光系数、反射光系数和高光强度四个参数影响。vtkVolumeProperty::SetAm......
  • VTK_Learning_体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制
    1.固定点光线投影算法vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者。该类能够实现基于Alpha合成的体绘制方法和最大密度投影体绘制方法,能......
  • python 绘制简易折线图
    #简易折线图绘制#encoding=utf-8#引入对应库文件importnumpyasnpimportmatplotlib.pyplotaspltx=np.linspace(0,20,100)#类似于平滑度0表示x坐标原......
  • 解析tid数据并绘制折线图(python)
    #解析tid数据并绘制折线图#encoding=utf-8#引入对应库文件importnumpyasnpimportmatplotlib.pyplotasplt#读取txt文件f=open('C:/Users/Administrator/D......
  • 第四节 进场保护区的绘制
    飞行程序设计软件实践一、传统进场保护区的绘制传统进场保护区绘制和评估的方式相对简单,困难的地方在于不同的规范对航路的宽度要求是不一样的。按照飞程序设计规范(DOC......
  • 第三节 PBN离场保护区的绘制
    飞行程序设计软件实践一、软件准备与任务分析软件工具:中望CAD、风标设计2023【社区版】。下载中望CAD对应的插件(WindSpiral2023中望版.dll),使用netload命令加载插件。......