2014-02-08 4 views
0
import cairo 
import math 

w = 2000 
h = 2000 

surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) 
ctx = cairo.Context(surface) 
ctx.scale(w, h) 

surface_path = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) 
ctx_path = cairo.Context(surface_path) 
ctx_path.scale(w, h) 

surface_circle = cairo.ImageSurface(cairo.FORMAT_ARGB32, w, h) 
ctx_circle = cairo.Context(surface_circle) 
ctx_circle.scale(w, h) 

""" Lots of function calls that draw paths to surface_path and circles to surface_circle """ 

ctx.set_source_surface(surface_path, 0, 0) 
ctx.paint() 
ctx.set_source_surface(surface_circle, 0, 0) 
ctx.paint() 

surface_path.write_to_png("example.png") 
surface_circle.write_to_png("example2.png") 
surface.write_to_png("result.png") 

Imgur link to saved imagesРисунок от одной поверхности к другой поверхности

Я пытающегося собрать две поверхности (одна с линиями, одна с кругами) на одну отдельную поверхность, а затем сохранить, что в файл.

Несмотря на то, что документация предлагает работать, окончательное изображение заканчивается пустым. Я также попытался позвонить flush() на surface_path и surface_circle, но это, казалось, ничего не делало.

Как я могу объединить информацию об изображении в surface_circle (example2.png) поверх surface_path (example.png), а затем вывести его в файл?

+0

Я не специалист в Каире, но я считаю, что вам нужна «маска». Например, вы выбираете источник и рисуете линию. По пути линии источник копируется в пункт назначения. Если вы ничего не рисуете, ничего не передается. Я бы предложил вам нарисовать большой прямоугольник размером с изображение. См http://cairographics.org/tutorial/#L1drawing – Cilyan

+0

'ctx.set_source_surface (surface_path, 0, 0) ctx.rectangle (0, 0, 1, 1) ctx.fill() ctx.set_source_surface (surface_circle , 0, 0) ctx.stroke() ctx.rectangle (0, 0, 1, 1) ctx.fill() ctx.stroke() ' Я попробовал этот код, но он все еще не кажется работать. – Sky

ответ

1

Попробуйте вызвать ctx.identity_matrix() перед последними вызовами paint().

Как правильно, теперь, благодаря вашему вызову ctx.scale (w, h), вы получаете только верхние левые пиксели этих других поверхностей, масштабированных для заполнения всей целевой поверхности.

+0

Казалось, что сработало. Я не совсем понимаю, что делает scale() или identity_matrix(), хотя :(Не могли бы вы кратко объяснить/связать меня с ресурсом, который объясняет? – Sky

+1

Ну, масштаб применяет масштабирование ко всем следующим операциям: a, b), все координаты, которые вы используете позже, будут умножены на a или b соответственно. Положив иначе, он притворяется, что поверхность, которую вы рисуете, имеет размер 1/a, 1/b. В вашем коде он масштабирует чтобы все координаты находились между 0 и 1 вместо 0 и w или h. Все, что имеет значение identity_matrix(), это сбросить все масштабирование, переводы и т. д., и вообще не возвращает никакого преобразования. Для некоторых документов см. http: // cairographics .org/ручной/каир-Transformations.html –

Смежные вопросы