Cómo optimizar el tamaño de la imagen usando una varita en python

Quiero cambiar el tamaño y optimizar el tamaño de la imagen png y jpg usando una varita.

Con PIL, puedo guardar la misma imagen con aproximadamente un tercio del tamaño si especifico la opción de optimización.

with open(filename, 'rb') as f: pimage = PImage.open(f) resized_pimage = pimage.resize((scaled_width, scaled_height), PImage.ANTIALIAS) bytes_buffer = io.BytesIO() resized_pimage.save(bytes_buffer, format="PNG", optimize=True) 

Sin embargo, no estoy seguro de cuál es la opción equivalente para Wand:

 with default_storage.open(filename, 'rb') as f: img = WImage(file=f) img.resize(width=scaled_width, height=scaled_height, filter='gaussian') with WImage(width=scaled_width, height=scaled_height) as png: png.composite(img, top=0, left=0) png.format = 'png' bytes_buffer = io.BytesIO() png.save(file=bytes_buffer) 

Leí algunos artículos sobre la optimización de imágenes para ImageMagic (por ejemplo, http://www.smashingmagazine.com/2015/06/efficient-image-resizing-with-imagemgick/ ) pero no es obvio cómo puedo hacer esto en Wand ( Soy un novato completo en Wand o PIL).

Cualquier ayuda / puntero sería muy apreciado.

Respuesta actualizada

Configurar la optimización con la varita requerirá una extensión / configuración adicional de la biblioteca MagickWand. Esto se debe a que el atributo de quality debe establecerse en la estructura de datos de la wand y no en la instancia de la imagen. ¿Confuso? Yo soy. Por suerte, la biblioteca de la varita de Python lo hace fácil. Intenta lo siguiente.

 # Require wand's API library and basic ctypes from wand.api import library from ctypes import c_void_p, c_size_t # Tell Python's wand library about the MagickWand Compression Quality (not Image's Compression Quality) library.MagickSetCompressionQuality.argtypes = [c_void_p, c_size_t] # Do work as before from wand.image import Image with Image(filename=filename) as img: img.resize(width=scaled_width, height=scaled_hight) # Set the optimization level through the linked resources of # the image instance. (ie `wand.image.Image.wand`) library.MagickSetCompressionQuality(img.wand, 75) img.save(filename=output_destination) 

Respuesta original

Hay muchos tipos de “optimización” para el formato png , pero tengo la impresión de que está buscando una forma de reducir el tamaño de la imagen.

Creo que wand.Image.compression_quality es lo que estás buscando.

 from wand.image import Image with Image(filename=filename) as img: img.resize(width=scaled_width, height=scaled_hight) img.compression_quality = 75 img.save(filename=output_destination) 

Lo anterior no reducirá la calidad al 75% como se esperaría con el formato JPEG , sino que le indicará qué biblioteca / algo / filtro de compresión PNG debe usar. Vea los ejemplos de Compresión PNG y Mejor compresión PNG .

 +-----+ | 7 5 | +-----+ | 0 . | Huffman compression (no-zlib) | 1 . | zlib compression level 1 | 2 . | zlib compression level 2 | 3 . | zlib compression level 3 | 4 . | zlib compression level 4 | 5 . | zlib compression level 5 | 6 . | zlib compression level 6 | 7 . | zlib compression level 7 | 8 . | zlib compression level 8 | 9 . | zlib compression level 9 | . 0 | No data encoding/filtering before compression | . 1 | "Sub" data encoding/filtering before compression | . 2 | "Up" data encoding/filtering before compression | . 3 | "Average" data encoding/filtering before compression | . 4 | "Paeth" data encoding/filtering before compression | . 5 | "Adaptive" data encoding/filtering before compression +-----+ 

Por lo tanto, establecer la calidad en 75 se comprimirá utilizando zlib nivel 7 después de realizar un filtro adaptive . Tenga en cuenta que esto es solo el nivel y el filtro, no la estrategia de optimización. La estrategia de optimización se puede configurar con la opción CLI -define png:compression-strategy=zs sin embargo, la varita aún tiene que implementar métodos de artefacto de imagen.