2009-03-05 10 views
5

Tengo que renderizar una imagen muy grande (> 50,000² píxel) con el cairo. Para hacer esto sin quedarse sin memoria, renderizo partes de la imagen (< 1,000² pixel) una tras otra y las fusiono más adelante.Grandes imágenes con el cairo

  1. Crear 1000x1000 superficie
  2. Traducir a la posición de la parte actual
  3. imagen Draw (llamando a las instrucciones de dibujo utilizando PyCairo)
  4. Render/Guarda la imagen en el archivo (cairo_surface_write_to_png)
  5. Repita con el siguiente parte

Como los algoritmos de recorte cairos son más rápidos que el mío, el paso tres dibuja toda la imagen, incluso si solo una parte es visible. La mayor parte de la CPU se usa en el Paso 3 (por python). La mayor parte de la memoria se usa en el Paso 4 (por cairo).

¿Hay alguna manera de acelerar las cosas? ¿Algo como esto?

  1. Crear 1000x1000 superficie
  2. imagen Draw
  3. mover todo a la posición de la parte actual
  4. Render/Guarda la imagen en el archivo
  5. Repetir 3 con parte siguiente

o

  1. Crear 50000x50000 superficie
  2. imagen Draw
  3. Render/guardar sólo la parte actual de la imagen en un archivo
  4. Repetir 3 con parte siguiente

Respuesta

2

En primer lugar, utilizando C o Vala en lugar de Python probablemente acelere las cosas.

En cuanto al uso de la memoria, trataría de escribir en mi propia transmisión, en lugar de un archivo (consulte write_to_png_stream). Este podría le permite (no lo intenté) controlar el uso de la memoria, asumiendo que Cairo no llama a su función solo una vez después de que todo está hecho.

+0

Otro idioma no es una opción y tampoco resolvería el problema, pero write_to_png_stream es una buena idea. Gracias – defnull

+0

De nada. Espero que funcione. –

Cuestiones relacionadas