2009-06-26 6 views
6

J'ai un répertoire plein d'images que je voudrais redimensionner à environ 60% de leur taille d'origine.Redimensionner des images dans le répertoire

Comment ferais-je cela? Peut-être soit dans Python ou Perl

Vive

Eef

+0

Je ne suis pas sûr. Tout d'abord, il ne dit pas que c'est un travail ponctuel. Deuxièmement - "Irfan View" pourrait ne pas être une option - par exemple en raison de contraintes du système d'exploitation. Troisièmement, ImageMagick est si complexe que même l'utiliser comme un outil batch est une sorte de programmation. –

Répondre

10

Peut-il être en coque?

mkdir resized 
for a in *.jpg; do convert "$a" -resize 60% resized/"$a"; done 

Si vous avez> 1 coeur, vous pouvez le faire comme ceci:

find . -maxdepth 1 -type f -name '*.jpg' -print0 | xargs -0 -P3 -I XXX convert XXX -resize 60% resized/XXX 

-P3 signifie que vous voulez redimensionner jusqu'à 3 images en même temps (parallélisation).

Si vous n'avez pas besoin de conserver les originaux, vous pouvez utiliser mogrify, mais je préfère utiliser convert, puis rm ...; MV ... - juste pour être du bon côté si le redimensionnement serait (pour une raison quelconque) échouer.

+0

Merci pour cela, c'était exactement ce que je cherchais. –

18

Si vous voulez le faire par programme, ce que je suppose est le cas, utilisez PIL pour redimensionner par ex.

newIm = im.resize((newW, newH) 

puis de l'enregistrer dans le même fichier ou dans un nouvel emplacement. Parcourez le dossier de manière récursive et appliquez la fonction de redimensionnement à toutes les images.

Je suis venu avec un exemple de script qui, je pense, va travailler pour vous. Vous pouvez améliorer cela: peut-être le rendre graphique, ajouter plus d'options, par ex. même extension ou peut être tout png, redimensionner l'échantillonnage linéaire/bilinéaire etc

import os 
import sys 
from PIL import Image 

def resize(folder, fileName, factor): 
    filePath = os.path.join(folder, fileName) 
    im = Image.open(filePath) 
    w, h = im.size 
    newIm = im.resize((int(w*factor), int(h*factor))) 
    # i am saving a copy, you can overrider orginal, or save to other folder 
    newIm.save(filePath+"copy.png") 

def bulkResize(imageFolder, factor): 
    imgExts = ["png", "bmp", "jpg"] 
    for path, dirs, files in os.walk(imageFolder): 
     for fileName in files: 
      ext = fileName[-3:].lower() 
      if ext not in imgExts: 
       continue 

      resize(path, fileName, factor) 

if __name__ == "__main__": 
    imageFolder=sys.argv[1] # first arg is path to image folder 
    resizeFactor=float(sys.argv[2])/100.0# 2nd is resize in % 
    bulkResize(imageFolder, resizeFactor)