2009-09-18 16 views
10

Tengo un código python que necesita hacer un par de cosas simples para las fotografías: recortar, cambiar el tamaño y superponer una marca de agua. He usado PIL, y los resultados de remuestreo/cambio de tamaño son TERRIBLES. He usado imagemagick, y la interfaz y los comandos fueron diseñados empacando un gato en una caja, y luego tirándolo repetidamente por unas escaleras al teclado.Alternativas de creación de imágenes de Python

Estoy buscando algo que no sea PIL o Imagemagick que pueda usar con python para hacer transformaciones de imagen simples y de alta calidad. Para el caso, ni siquiera tiene que tener enlaces de python si la interfaz de línea de comandos es buena.

Ah, y tiene que ser relativamente independiente de la plataforma, nuestros servidores de producción son linux, pero algunos de nuestros desarrolladores se desarrollan en Windows. No puede requerir la instalación de un montón de código gui tonto para usar como biblioteca, tampoco.

+1

Esperarás un momento. PyMagick es lo único que hay aparte de PIL. –

+3

¿Cómo encuentran las personas que la PIL es aceptable? Cualquier operación de cambio de tamaño (incluso reducción de resolución) produce artefactos y imágenes borrosas, incluso con la configuración de remuestreo de ANTIALIAS. He intentado durante horas hacer que produzca resultados que aceptaría, pero en comparación con herramientas de escritorio como Photoshop o GIMP, el redimensionamiento de PIL es patético. –

+1

Uso el tamaño con antialias para generar, miniaturas para una aplicación de generación de documentos, y son comparables a lo que el visualizador de acrobat pdf hace –

Respuesta

17

He usado PIL, y los resultados de remuestrear/cambiar el tamaño son TERRIBLES.

No deben ser, siempre y cuando:

  1. uso sólo Image.ANTIALIAS filtrado para las operaciones de reducción de escala
  2. uso exclusivo para las operaciones de filtrado Image.BICUBIC ampliación de la escala.
  3. recuerde convertir al modo de color 'RGB' antes de cambiar el tamaño si está usando una imagen con paleta
  4. no utilice .thumbnail(). es una mierda
  5. establezca el nivel de quality= a algo apropiado al guardar archivos JPEG (el valor por defecto es bastante baja)
+0

Ya sabes, después de algunas pruebas adicionales, los resultados * son * mejores con el tamaño en oposición a la miniatura, incluso con ambos usando el algoritmo Image.ANTIALIAS. Si lo pienso más tarde, publicaré algunos resultados de muestra de varias operaciones. –

+1

Ver http://stackoverflow.com/questions/1386400/pil-image-resizing-algorithm-similar-to-firefoxs - no se compara exactamente con "like" pero claramente hay algo bastante incorrecto en lo que es la miniatura() obra. – bobince

+0

Solo quería reforzar el punto 5. Es fácil pasar por alto, y es la causa principal de los problemas de los que originalmente se quejaba esta pregunta. –

1

PIL puede hacer un buen cambio de tamaño. Asegúrese de que su imagen de origen esté en modo RGB, no en colores de paleta, y pruebe las diferentes opciones de algoritmo.

+0

Siempre lo he usado en archivos JPEG simples. Image.open ('myfile.jpg'), luego Image.thumbnail o Image.resize, seguido de Image.save ... Todos con la configuración ANTIALIAS para downsampling. Eso debería estar en modo RGB por defecto (los jpegs son RGB) y con el mejor algoritmo para la reducción de muestreo, ¿no? Si me falta algo, me encantaría saber lo que tengo mal ... –

+0

Sin ver el código fuente y las imágenes de origen, es difícil decir qué está pasando. Mucha gente usa PIL para este tipo de trabajo y están contentos con los resultados. Algo es diferente en su caso (¿tiene especialmente ojos de águila?), Pero aún no hemos descubierto qué es. –

1

Mientras que imagemagick parece ser la biblioteca de imágenes de código abierto de facto, posiblemente DevIL (plataforma cruzada, parece hacer operaciones de imagen simples) o FreeImage.

1

Ha comprobado pypi? Una búsqueda superficial muestra algunas herramientas relacionadas con imágenes, también descubrí python-gd, sin embargo, no sé qué tan útil podría ser.

Nunca he tenido ningún problema con PIL, pero algún tipo de variedad podría ser interesante.

1

GIMP tiene una interfaz de línea de comandos razonable, creo.

+0

Desafortunadamente GIMP requiere GTK +, que es una biblioteca bastante tonta para tener instalada en un servidor sin cabeza. –

1

Tome un vistazo a algunas de estas bibliotecas de imágenes:

hxxp: //pypi.python.org/pypi/collective.croppingimagefield/0.1beta

hxxp: //pypi.python.org/ pypi/cropresize/0.1.1

hxxp: //pypi.python.org/pypi/image_resize/1.0

0

La última vez que se comparan, la salida de este downscaler es casi idéntica a la de la opción de GIMP "cúbica":

import Image 

def stretch(im, size, filter=Image.NEAREST): 
    im.load() 
    im = im._new(im.im.stretch(size, filter)) 
    return im 

IIRC, las diferencias son visualmente indistinguibles - algunos valores de píxel +/- 1 debido a redondeo, y tienden a ser alrededor de los bordes. No es lento tampoco.

cf: http://www.mail-archive.com/[email protected]/msg00248.html

2

estoy seguro de por qué se está Image.thumbnail tales antibalas. En el presente lanzamiento que me estoy quedando sin nada más que averiguar el tamaño deseado y cambiar el tamaño de la imagen en su lugar. Siempre que use el filtro de muestreo adecuado y lo convierta a RGB primero (como dice bobince), la miniatura no debe ser diferente de cambiar el tamaño.

Aquí está la fuente real para el método miniatura:

def thumbnail(self, size, resample=NEAREST): 
    # preserve aspect ratio 
    x, y = self.size 
    if x > size[0]: y = max(y * size[0]/x, 1); x = size[0] 
    if y > size[1]: x = max(x * size[1]/y, 1); y = size[1] 
    size = x, y 

    if size == self.size: 
     return 

    self.draft(None, size) 

    self.load() 

    try: 
     im = self.resize(size, resample) 
    except ValueError: 
     if resample != ANTIALIAS: 
      raise 
     im = self.resize(size, NEAREST) # fallback 

    self.im = im.im 
    self.mode = im.mode 
    self.size = size 

    self.readonly = 0 
0

He usado PIL, y al volver a muestrear/redimensionar resultados son terribles.

El cambio de tamaño en PIL se ha roto de muchas maneras y el PIL no se mantiene durante mucho tiempo. A partir de Pillow 2.7, la mayoría de los problemas se solucionan junto con una mejora espectacular del rendimiento. Asegúrese de estar usando latest Pillow.

Cuestiones relacionadas