问题描述
我正在尝试使用开罗创建灰度图像,但是我在控制笔的像素强度时遇到问题。
例如,在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楼
在上面的代码中,黑色圆圈不会出现,因为它的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()