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?
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.
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