Я пытаюсь создать изображения в оттенках серого с помощью 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()
Я не могу найти эквивалентный код для изображения в градациях серого. Я не могу просто использовать альфа-канал, потому что тогда я не могу рисовать круги поверх прямоугольников. Например, возьмите приведенный ниже фрагмент кода, где я хотел бы иметь:
- Серый фон
Черный круг на сером фоне
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()
В приведенном выше коде черный кружок не появится, потому что его альфа-канал ниже серого фона. Как я могу это исправить?
ctx.set_operator
, возможно, OPERATOR_CLEAR может сработать. Я попробую и вернусь к вам. Я не знал о методеset_operator
, спасибо, что напомнили! - person Arash Outadi   schedule 24.09.2018