Pregunta

Tengo un código de Python que necesita hacer solo un par de cosas simples para fotografiar: recortar, redimensionar y superponer una marca de agua. He usado PIL, y los resultados de remuestreo / cambio de tamaño son TERRIBLES. Utilicé imagemagick, y la interfaz y los comandos fueron diseñados empacando un gato en una caja y luego arrojándolo repetidamente por un conjunto de escaleras con un teclado.

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

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

¿Fue útil?

Solución

  

He usado PIL, y los resultados de remuestreo / cambio de tamaño son TERRIBLES.

No deberían serlo, siempre y cuando:

  1. use solo el filtrado Image.ANTIALIAS para operaciones de reducción de escala
  2. use solo el filtro Image.BICUBIC para las operaciones de escalado.
  3. recuerde convertir al modo de color 'RGB' antes del cambio de tamaño si está utilizando una imagen paletizada
  4. no use .thumbnail (). es una mierda
  5. establezca el nivel quality = en algo apropiado al guardar archivos JPEG (el valor predeterminado es bastante bajo)

Otros consejos

No estoy seguro de por qué Image.thnail está recibiendo tanta falla. En la versión actual que me estoy quedando sin hacer nada más que averiguar el tamaño deseado y cambiar el tamaño de la imagen en su lugar. Mientras esté usando el filtro de remuestreo apropiado y convierta a RGB primero (como dice bobince), la miniatura no debería ser diferente al cambio de tamaño.

Aquí está la fuente real para el método de 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

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

Si bien imagemagick parece ser la biblioteca de imágenes de facto de código abierto, posiblemente DevIL ( multiplataforma, parece realizar operaciones de imagen simples) o FreeImage .

¿Ha verificado pypi ? Una búsqueda rápida muestra algunas herramientas relacionadas con la imagen allí, también descubrí python-gd, aunque no tengo idea de lo útil que podría ser.

Nunca tuve problemas con PIL, pero algún tipo de variedad podría ser interesante.

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

Eche 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

La última vez que comparé, la salida de este reductor de escala es casi idéntica a la del "cubic" de GIMP opción:

 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íxeles +/- 1 debido al redondeo, y tienden a ser redondeados. Tampoco es lento.

cf: http: //www.mail-archive .com / image-sig @ python.org / msg00248.html

  

He usado PIL, y los resultados de remuestreo / cambio de tamaño son TERRIBLES.

El cambio de tamaño en PIL se rompió de muchas maneras y PIL no se mantiene durante mucho tiempo. A partir de Pillow 2.7 la mayoría de los problemas se resuelven con una mejora dramática en el rendimiento. Asegúrese de estar utilizando la última almohada .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top