Большие изображения с Каиром - PullRequest
5 голосов
/ 05 марта 2009

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

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

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

Есть ли способ ускорить процесс? Как то так?

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

или

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

1 Ответ

2 голосов
/ 05 марта 2009

Прежде всего, использование C или Vala вместо Python, вероятно, ускорит процесс.

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

...