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

Posted

技术标签:

【中文标题】如何更改灰度图像的 cairo 上下文源颜色【英文标题】:How to change cairo context source color for grayscale images 【发布时间】:2018-09-24 02:18:41 【问题描述】:

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

例如,在 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 通道,因为那样我就不能在矩形上画圆。例如,拿下面的代码 sn-p,我想有:

灰色背景

灰色背景上的黑色圆圈

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 通道低于灰色背景。我该如何解决这个问题?

【问题讨论】:

您在第二个示例中的目标到底是什么?你使用 set_source_rgb,所以这里有 alpha=1。所以,你只是用非 alpha 填充表面。 ctx.set_operator(cairo.OPERATOR_SOURCE) 可能会帮助您/做您想做的事吗? 嘿@UliSchlachter,我更新了我的帖子以包含更多关于我想要实现的目标的信息,关于ctx.set_operator,OPERATOR_CLEAR 可能会起作用。我会尝试一下并回复你。我不知道set_operator 方法,感谢您提出! 【参考方案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()

【讨论】:

太棒了,非常感谢。这正是我想要的!对于其他好奇的人,您可以在此处阅读有关运算符的更多信息:cairographics.org/operators

以上是关于如何更改灰度图像的 cairo 上下文源颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何将 WORD中将彩色图片变成灰度图 或 黑白图 ?

matlab中将灰度图转化为二值图后,有如何转化为灰度图

S0.2 灰度图

将视频转换为单张图片(灰度)【MATLAB】

如何设置一个获取灰度图像并输出 ARGB 的图层,使其中一种灰度颜色透明?

使用 matplotlib 将图像显示为灰度