アルファチャンネルを含む可能性のある画像をカイロに変換したいと考えています。
私が書いたコードは、完全に不透明な画像をグレースケールに変換しますが、画像にアルファ チャネルが含まれていると失敗します。
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 のバージョンを入手するにはどうすればよいですか?
[*] これらの値は、cairo では通常のように、アルファによって乗算された RGB 値を持つことに注意してください。