合成(Compositions)¶
我们在计算机中绘图,实际就是在改变目标点(像素)的色彩。除了最简单的直接复制来源(画笔)色彩外,可以通过对来源色彩(画笔的色彩)和目标色彩(目的点的原有色彩)进行合成运算来决定目标点的最终色彩。合成模式(Composition mode)的作用就是控制如何对来源色彩和目标色彩进行合成。
Easygraphics (以及它使用的Qt系统)支持三种类型的合成运算:
- 光栅运算 (Raster Operation (ROP),也称为位运算(Bitwise Operation)或者位块传输(Bit Blit)):使用位运算对来源色彩和目标色彩进行合成。此运算要求来源色彩和目标色彩都是不透明的(alpha值为255)。
- Alpha合成(Alpha compositing) : 将包含透明信息的来源色彩和目标色彩进行合成,从而产生带透明效果的色彩合成操作。
- 混合(Blend) : 主要应用于数字图像处理,将两个图层相互混合得到最终的结果。
这三类操作并非严格正交,某些合成操作同时属于上述类型中的两类或三类。
光栅运算(Bit Blit)¶
在计算机发展的早期,图形系统尚不支持透明时,主要使用光栅运算进行色彩的合成。因为它只支持对不透明的颜色进行合成,因此现代图形系统中已经很少使用了。
一个典型的例子是反复使用按位XOR合成运算在同一个位置重复绘制一个图形。第二次绘制时,原有图形会被擦除。这样就可以实现动画的效果。
在下面的例子中,使用按位XOR运算来绘制和清除一个椭圆。注意,如果换成其他的颜色,将无法产生本例中的效果。
from easygraphics import *
def main():
init_graph(400, 200)
set_render_mode(RenderMode.RENDER_MANUAL)
set_background_color("white")
x = 100
ellipse(x, 100, 100, 50) # draw a ellipse
set_color("white")
set_composition_mode(CompositionMode.SRC_XOR_DEST)
while is_run():
old_x = x
x = (x + 5) % 400
ellipse(old_x, 100, 100, 50) # clear the ellipse last drawn
ellipse(x, 100, 100, 50) # draw a new ellipse
delay_fps(30)
close_graph()
easy_run(main)
Alpha合成(Alpha Comositing)¶
Alpha合成是目前应用最多的合成运算类型。
下表展示了alpha合成的效果:
Source和Source Over是用的最多的两种合成运算。
来源色彩(Source)和目标色彩(Destination)均不透明 | |||
Source | Source Over | source in | |
source out | source atop | xor | |
Destination | Destination Over | Destination in | |
Destination out | Destination atop | xor | |
来源色彩(Source)和目标色彩(Destination)半透明 | |||
Source | Source Over | source in | |
source out | source atop | xor | |
Destination | Destination Over | Destination in | |
Destination out | Destination atop | xor |