合成(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 *

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()

Alpha合成(Alpha Comositing)

Alpha合成是目前应用最多的合成运算类型。

下表展示了alpha合成的效果:

Source和Source Over是用的最多的两种合成运算。

来源色彩(Source)和目标色彩(Destination)均不透明 source_o source_over_o source_in_o
  Source Source Over source in
  source_out_o source_atop_o xor_o
  source out source atop xor
  destination_o destination_over_o destination_in_o
  Destination Destination Over Destination in
  destination_out_o destination_atop_o xor_o
  Destination out Destination atop xor
来源色彩(Source)和目标色彩(Destination)半透明 source_t source_over_t source_in_t
  Source Source Over source in
  source_out_t source_atop_t xor_t
  source out source atop xor
  destination_t destination_over_t destination_in_t
  Destination Destination Over Destination in
  destination_out_t destination_atop_t xor_t
  Destination out Destination atop xor

混合(Blend)

混合主要用于数字图像或照片处理。请阅读 维基百科 中的相关条目。