Quel est le moyen le plus rapide pour générer des vignettes d'image en Python?
Je suis en train de construire une galerie de photos en Python et que vous voulez être en mesure de rapidement générer des vignettes pour les images en haute résolution.
Quel est le moyen le plus rapide pour générer de haute qualité des miniatures d'une variété de sources d'image?
Dois-je utiliser une bibliothèque externe comme imagemagick, ou est-il un moyen de faire cela?
Les dimensions des images redimensionnées sera (max):
120x120
720x720
1600x1600
De la qualité est un problème, car je veux préserver autant de les couleurs de l'original que possible et de minimiser les artefacts de compression.
Grâce.
- Vous pouvez utiliser Python Baguette, qui appelle Imagemagick pour le faire. Je ne peux pas dire si c'est la plus rapide. Python OpenCV peut être plus rapide.
Vous devez vous connecter pour publier un commentaire.
Vous voulez PIL il le fait avec facilité
Si vous avez désespérément besoin de vitesse. Puis c'est le fil, multi process ou obtenir une autre langue.
import Image
, vous devriez plutôt utiliserfrom PIL import Image
thumbnail_%s_%s-%s" % (image, size[0], size[1])
).J'ai rêvé de plaisir donc j'ai fait un peu d'analyse comparative sur les différentes méthodes proposées ci-dessus et quelques idées de mon propre.
J'ai rassemblé 1000 haute résolution 12 MP iPhone 6S images, chaque 4032x3024 pixels et l'utilisation d'un 8-core iMac.
Voici les techniques et les résultats de chacun dans sa propre section.
Méthode 1 - Séquentielle ImageMagick
C'est simpliste, unoptimised code. Chaque image est lue et une vignette est produite. Alors qu'il est en lecture encore et une autre vignette de taille est produite.
Résultat: 170 secondes
Méthode 2 - Séquentielle ImageMagick avec une seule charge et successives de redimensionnement
C'est encore séquentielle, mais un peu plus intelligent. Chaque image est seulement lu une seule fois et de l'image chargée est alors redimensionnée trois fois et sauvé à trois résolutions. L'amélioration est que chaque image est lue une seule fois, pas 3 fois.
Résultat: 76 secondes
Méthode 3 - GNU Parallèle + ImageMagick
Cela s'appuie sur la méthode précédente, en utilisant GNU Parallèle de processus
N
images en parallèle, oùN
est le nombre de cœurs du PROCESSEUR de votre machine.Résultat: 18 secondes
Méthode 4 - GNU Parallèle + vip
C'est la même que la méthode précédente, mais il utilise
vips
à la ligne de commande au lieu de ImageMagick.Résultat: 8 secondes
Méthode 5 - Séquentielle PIL
Ce qui est destiné à correspondre à Jakob réponse.
Résultat: 38 secondes
Méthode 6 - Séquentielle PIL avec une seule charge & successives redimensionner
C'est une amélioration de Jakob réponse, dans lequel l'image est chargée, juste une fois, puis réduction de la taille trois fois au lieu de le charger à nouveau à chaque fois pour produire chaque nouvelle résolution.
Résultat: 27 secondes
Méthode 7 - Parallèle PIL
Ce qui est destiné à correspondre à Audionautics de réponse, dans la mesure où il utilise Python multiprocessing. Il permet également d'éviter la nécessité de re-charger l'image pour chaque taille de vignette.
Résultat: 6 secondes
Méthode 8 - Parallèle OpenCV
Ce qui est destiné à être une amélioration sur bcattle de répondre, dans la mesure où il utilise OpenCV, mais il permet également d'éviter la nécessité de re-charger l'image à générer chaque nouvelle résolution de sortie.
Résultat: 5 secondes
Un peu en retard sur la question (un an!), mais je vais piggy backing sur le "multi process il" partie de @JakobBowyer de réponse.
C'est un bon exemple d'une parallèle gênant problème, comme le principal morceau de code n'est pas muter tout état externe à lui-même. Il se contente de lire une entrée, effectue son calcul et enregistre le résultat.
Python est en fait assez bien à ces types de problèmes grâce à la fonction map fournie par
multiprocessing.Pool
.La base du code est exactement le même que @JakobBowyer, mais au lieu de le lancer en boucle dans un seul thread, on l'enveloppa dans une fonction de l'étaler sur plusieurs cœurs via le multitraitement fonction map.
zip
si?zip
fait référence à cette fonction, pas le format de fichier compressé.Une autre option est d'utiliser le liaisons python à OpenCV. Cela peut être plus rapide que PIL ou Imagemagick.
Il y a une solution complète,ici.
Si vous voulez l'exécuter en parallèle, l'utilisation
simultanées.les contrats à terme
sur Py3 ou laterme
paquet sur Py2.7:Si vous êtes déjà familier avec imagemagick, pourquoi ne pas coller avec le python bindings?
PythonMagick
Python 2.7, Windows x64 utilisateurs
En plus de @JakobBowyer & @Audionautics,
PIL
est assez vieux et vous pouvez trouver vous-même le dépannage et la recherche de la bonne version... au lieu de cela, utiliserPillow
de ici (source)la mise à jour de l'extrait de code ressemblera à ceci:
dénombrement complet de script pour la création de la miniature:
Je suis tombé sur cette quand à essayer de comprendre qui de la bibliothèque que je devrais utiliser:
Il semble que OpenCV est clairement plus rapide que PIL.
Cela dit, je suis en train de travailler avec des feuilles de calcul et il s'avère que le module j'ai été en utilisant openpyxl déjà m'oblige à importer PIL pour insérer des images.