web-dev-qa-db-fra.com

Comment effectuer une compression JPEG en Python sans écrire / lire

Je voudrais travailler directement avec des images JPEG compressées. Je sais qu'avec PIL/Pillow, je peux compresser une image lorsque je l'enregistre, puis relire l'image compressée - par exemple.

from PIL import Image
im1 = Image.open(IMAGE_FILE)
IMAGE_10 = os.path.join('./images/dog10.jpeg')
im1.save(IMAGE_10,"JPEG", quality=10)
im10 = Image.open(IMAGE_10)

mais, je voudrais un moyen de le faire sans l'écriture et la lecture superflues. Y a-t-il un Python avec une fonction qui prendra une image et un numéro de qualité en entrée et retournera une version jpeg de cette image avec la qualité donnée?

13
user1245262

Pour les fichiers de type fichier en mémoire, vous pouvez utiliser StringIO. Regarde:

from io import StringIO # "import StringIO" directly in python2
from PIL import Image
im1 = Image.open(IMAGE_FILE)

# here, we create an empty string buffer    
buffer = StringIO.StringIO()
im1.save(buffer, "JPEG", quality=10)

# ... do something else ...

# write the buffer to a file to make sure it worked
with open("./photo-quality10.jpg", "w") as handle:
    handle.write(buffer.contents())

Si vous cochez la case photo-quality10.jpg fichier, il doit s'agir de la même image, mais avec une qualité de 10% comme paramètre de compression JPEG.

14
sgammon

Utilisation de BytesIO

try:
    from cStringIO import StringIO as BytesIO
except ImportError:
    from io import BytesIO

def generate(self, image, format='jpeg'):
    im = self.generate_image(image)
    out = BytesIO()
    im.save(out, format=format,quality=75)
    out.seek(0)
    return out

StringIO est manquant dans Python3.0, référez-vous à: StringIO dans python

5
Super Engine