Большие изображения с Каиром

Мне нужно отрендерить очень большое изображение (> 50,000² пикселей) с помощью cairo. Чтобы сделать это без нехватки памяти, я визуализирую части изображения (‹1.000² пикселей) одну за другой и позже объединяю их вместе.

  1. Создать поверхность размером 1000x1000
  2. Перевести в положение текущей детали
  3. Нарисуйте изображение (вызовите инструкции по рисованию с помощью pycairo)
  4. Визуализировать / сохранить изображение в файл (cairo_surface_write_to_png)
  5. Повторите со следующей частью

Поскольку алгоритмы отсечения cairos быстрее, чем мои собственные, на третьем шаге отрисовывается все изображение, даже если видна только его часть. Большая часть ЦП используется на шаге 3 (python). Большая часть памяти используется на шаге 4 (от cairo).

Есть ли способ ускорить процесс? Что-то вроде этого?

  1. Создать поверхность размером 1000x1000
  2. Нарисуйте изображение
  3. Переместить все в положение текущей части
  4. Визуализировать / сохранить изображение в файл
  5. Повторите 3 со следующей частью

or

  1. Создать поверхность размером 50000x50000
  2. Нарисуйте изображение
  3. Визуализировать / сохранить в файл только текущую часть изображения
  4. Повторите 3 со следующей частью

person defnull    schedule 05.03.2009    source источник


Ответы (1)


Во-первых, использование C или Vala вместо Python, вероятно, ускорит процесс.

Что касается использования памяти, я бы попытался записать в свой поток, а не в файл (см. write_to_png_stream). Это может позволить вам (я не пробовал этого) контролировать использование памяти, предполагая, что Cairo не вызовет вашу функцию только один раз после того, как все будет сделано.

person Can Berk Güder    schedule 05.03.2009
comment
Другой язык не вариант и тоже не решит проблему, но write_to_png_stream - хорошая идея. Спасибо - person defnull; 05.03.2009