gpt4 book ai didi

python - 如何使用 Cairo 将图像转换为灰度

转载 作者:太空宇宙 更新时间:2023-11-04 01:33:03 24 4
gpt4 key购买 nike

我想将可能带有 alpha channel 的图像转换为 cairo。

我编写的代码将完全不透明的图像转换为灰度,但当图像包含 alpha channel 时失败:

import cairo
CAIRO_OPERATOR_HSL_LUMINOSITY = 28 # my py2cairo seems outdated

def convert_to_grayscale(img_in):
img_out = img_in.create_similar(
cairo.CONTENT_COLOR_ALPHA, img_in.get_width(), img_in.get_height())
cr = cairo.Context(img_out)
cr.set_source_rgba(1, 1, 1, 1)
cr.paint()
cr.set_source_surface(img_in)
cr.set_operator(CAIRO_OPERATOR_HSL_LUMINOSITY)
cr.paint()

return img_out

包含 RGBA 值 (20, 30, 40, 255) 的图像将(正确)转换为 (28, 28, 28, 255)。但是,如果图像不是完全不透明,结果将是错误的,例如,如果我将图像转换为颜色 (10, 15, 20, 128),我将返回 (141, 141, 141, 25),当我期待 (14, 14, 14, 128)[*]。我怎样才能获得一个可以很好地处理半透明图像的 convert_to_grayscale 版本?

[*] 请注意,这些值的 RGB 值预乘了它们的 alpha,这在开罗很常见。

最佳答案

我今天也想做同样的事情,想出了一个不同的方法来做到这一点。我实际上并没有用 Python 来做这件事,事实上我根本不懂 Python,所以我无法提供任何代码。但是,这就是我所做的:

  • 从原始图像创建一个表面
  • 为该表面创建一个图案
  • 应用具有 CAIRO_OPERATOR_HSL_SATURATION 的 rgb 源(黑色),使用图案作为 mask

为了让事情更清楚,在 C 中它的意思是这样的(其中 s 是新的 cairo_surface_t,而 cr 是它关联的 cairo_t;假设你已经把那里有原始图片):

cairo_pattern_t *pattern = cairo_pattern_create_for_surface (s);
cairo_rectangle (cr, 0, 0, width, height);
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_set_operator (cr, CAIRO_OPERATOR_HSL_SATURATION);
cairo_mask (cr, pattern);
cairo_pattern_destroy (pattern);

在这里添加它以防/希望它可能对某些人有所帮助。

关于python - 如何使用 Cairo 将图像转换为灰度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com