我想将可能带有 alpha 通道的图像转换为 cairo。
我编写的代码将完全不透明的图像转换为灰度,但当图像包含 alpha 通道时失败:
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 值相乘,这在开罗很常见。