Windows中的图像接口与原理

桌面窗口属性

Form::Opacity, SetLayeredWindowAttributes

设置窗口的透明度级别,设置范围为0到1,

Form::TransparencyKey

设置窗口透明区域的颜色。当窗体的该属性被设置了一个颜色,那么窗体上具有该颜色的区域就会透明,透明部分也不会接到鼠标事件。

Alpha通道

Alpha通道是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明。 32位真彩色,即在24位真彩色图像的基础上再增加一个表示图像透明度信息的Alpha通道。 Alpha 通道,取值为0到1,用来储存这个像素是否对图片有「贡献」,0代表透明、1代表不透明。也就是说,「Alpha 通道」储存一个值,其外在表现是「透明度」,Alpha 和透明度没啥关系。 白色(值为255)的Alpha像素用以定义不透明的彩色像素,而黑色(值为0)的Alpha通道像素用以定义透明像素,介于黑白之间的灰度(值为30-255)的Alpha像素用以定义不同程度的半透明像素。因而通过一个32位总线的图形卡来显示带Alpha通道的图形,就可能呈现出透明或半透明的视觉效果。

图像透明的原理

图像透明本质上是两个图像的加权叠加,叠加之后使得原始的两张图片的像素成分都得以体现,这样人眼感觉起来就是,既能看到底层图像、又能看到顶层图像。之所以视觉上你觉得一张图片透明,是因为上层图片有透明通道,使得你看到了上层像素和下层像素叠加的结果。在叠加的时候,透明感越强的图片,其对应的加权系数越小。如果图片含有Alpha通道,那么就能以像素粒度来区分透明度。

我们这里假设底层图片是不透明的,上层透明的透明度为Alpha(每个像素的透明度均为Alpha)。

那么对于底层像素(R2,G2,B2),上层像素(R1,G1, B1),透明叠加的结果如下:

R   =   R1   *   Alpha   +   R2   *   (1-Alpha)   
G   =   G1   *   Alpha   +   G2   *   (1-Alpha)     
B   =   B1   *   Alpha   +   B2   *   (1-Alpha)   

由于加权参数的和为1,这也保证了叠加后的结果范围在0-255.

图像数据属性

ImageAttributes::SetGamma

设置图像的gamma参数。一个图像对象具有五个调整分类:default, bitmap, brush, pen, and text。可以通过这个方法来设置每个分类的gamma值。

GAMMA值的意义

GAMMA值是对颜色通道值进行矫正运算的系数。灰阶有限的前提下,因为人眼对自然的非线性感知特性,我们才需要Gamma校正。人眼对暗部细节比较敏感,对亮部细节不敏感。Gamma矫正就是对颜色进行指数运算。对图像进行矫正是为了获得符合人眼特性的可辨识精度。

Graphics Library

https://skia.org/

*****
Written by Lu.dev on 20 September 2017