J'ai présenté il y a quelques mois l'utilisation de PIL ou Pillow pour retailler ou "croper" des images.
Pour rappel, Pillow est un fork amical de PIL, dans le but de dynamiser son développement. Aujourd'hui les distributions GNU/Linux majeures sont passées à Pillow. La documentation de Pillow était d'ailleurs encore assez horrible il y a quelques mois et je viens de découvrir que ça s'est grandement amélioré :)
Ici, je vais vous présenter une autre fonction intéressante qui me permet de réaliser des séquences d'images pour retranscrire par exemple une dynamique dans une image.
from PIL import Image
def make_sequence(filenames, output):
"""
Make a sequence of N pictures
:params filenames: tuple of filenames
:params output: output filename
"""
# Open the picture and get its size
im1 = Image.open(filenames[0])
x1, y1 = im1.size
# Prepare the new picture
new = Image.new("RGB", (len(filenames)*x1,y1), "Black")
# Paste each picture of the tuple on the new picture
for i, im in enumerate(filenames):
image = Image.open(im)
new.paste(image, (i*x1, 0))
# Save the picture
new.save(output)
On peut aussi avoir besoin de mettre un étalon. Pour celà, on applique un carré blanc (le fond étant noir dans mon cas). On utilise là aussi la fonction paste.
sc1 = Image.new("RGB", (scale1, 10), "White")
new.paste(sc1, (0+50, y1-50))
Une autre fonction pouvant être utile dans ce genre de scripts est la rotation des images :
im.rotate(-1.4, Image.BICUBIC)
Une valeur négative signifie une rotation horraire. Trois méthodes sont possibles : NEAREST, BILINEAR et BICUBIC
J'ai remarqué être confronté souvent à ce même genre de petites tâches, parfois sur des masses de données importantes (comme quelques Go de photos), parfois pour des choses où je veux garder une tracabilité de ce que j'ai fait de manière à pouvoir modifier et rejouer le processus rapidement. Il doit y avoir des logiciels graphiques très performants, mais ces codes sont très flexibles et avec le temps, la banque de snippets permet de couvrir rapidement les besoins.