如何更改灰度图像的开罗上下文源颜色

时间:2018-09-24 02:18:41

标签: python cairo pycairo

我正在尝试使用开罗创建灰度图像,但是我在控制笔的像素强度时遇到问题。

例如,在RGB彩色图像中,我将使用此代码在红色通道中将背景绘制为红色,像素强度为127。

surface = cairo.ImageSurface(cairo.FORMAT_RGB24, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
ctx.set_source_rgb(.5, 0, 0)
ctx.rectangle(0, 0, WIDTH, HEIGHT)
ctx.fill()

我找不到灰度图像的任何等效代码。 我不能简单地使用Alpha通道,因为那样我就不能在矩形上绘制圆。例如,以下面的代码片段为例:

  • 灰色背景
  • 灰色背景上方的黑色圆圈

    surface = cairo.ImageSurface(cairo.FORMAT_A8, WIDTH, HEIGHT) ctx = cairo.Context(surface) ctx.set_source_rgba(0, 0, 0, 0.5) ctx.rectangle(0, 0, WIDTH, HEIGHT) ctx.fill() ctx.set_source_rgba(0, 0, 0, 0.0) ctx.arc(WIDTH//2, HEIGHT//2, r, 0, 2*math.pi) ctx.fill()

在上面的代码中,黑色圆圈不会出现,因为它的Alpha通道低于灰色背景。我该如何解决?

1 个答案:

答案 0 :(得分:1)

  

在上面的代码中,黑色圆圈不会出现,因为它的Alpha通道低于灰色背景。

默认运算符是OVER,它覆盖内容。如果您有一些完全透明的叠加层,那么该叠加层是不可见的。因此,这不是因为较低的Alpha通道。如果您的alpha通道稍高一点(例如0.5和0.1),则结果将是结果图像中的alpha通道值约为0.6。

  

我该如何解决?

surface = cairo.ImageSurface(cairo.FORMAT_A8, WIDTH, HEIGHT)
ctx = cairo.Context(surface)
// I added the following line, but I am not sure about the syntax.
// In C, this would by cairo_set_operator(ctx, CAIRO_OPERATOR_SOURCE);
ctx.set_operator(cairo.OPERATOR_SOURCE)
ctx.set_source_rgba(0, 0, 0, 0.5)
ctx.rectangle(0, 0, WIDTH, HEIGHT)
ctx.fill()
ctx.set_source_rgba(0, 0, 0, 0.0)
ctx.arc(WIDTH//2, HEIGHT//2, r, 0, 2*math.pi)
ctx.fill()