Comment compléter cette fonction python pour sauvegarder dans le même dossier?
-
22-07-2019 - |
Question
J'essaie d'écrire ma première vraie fonction python qui fait quelque chose de réel. Ce que je veux accomplir est de rechercher un dossier donné, puis d’ouvrir toutes les images et de les fusionner afin qu’elles forment une image de pellicule. Imaginez 5 images empilées les unes sur les autres dans une seule image.
J'ai ce code maintenant, ce qui devrait être assez correct, mais a probablement besoin d'une modification:
import os
import Image
def filmstripOfImages():
imgpath = '/path/here/'
files = glob.glob(imgpath + '*.jpg')
imgwidth = files[0].size[0]
imgheight = files[0].size[1]
totalheight = imgheight * len(files)
filename = 'filmstrip.jpg'
filmstrip_url = imgpath + filename
# Create the new image. The background doesn't have to be white
white = (255,255,255)
filmtripimage = Image.new('RGB',(imgwidth, totalheight),white)
row = 0
for file in files:
img = Image.open(file)
left = 0
right = left + imgwidth
upper = row*imgheight
lower = upper + imgheight
box = (left,upper,right,lower)
row += 1
filmstripimage.paste(img, box)
try:
filmstripimage.save(filename, 'jpg', quality=90, optimize=1)
except:
filmstripimage.save(miniature_filename, 'jpg', quality=90)")
Comment puis-je modifier cela pour qu'il enregistre le nouveau filmstrip.jpg dans le même répertoire que celui où j'ai chargé les images? Et il a probablement des choses qui manquent ou qui ne vont pas, quelqu'un a un indice?
Question connexe: Comment générer une image de pellicule en python à partir d'un dossier d'images?
La solution
Ce n'est pas une réponse à votre question, mais cela pourrait être utile:
#!/usr/bin/env python
import Image
def makefilmstrip(images, mode='RGB', color='white'):
"""Return a combined (filmstripped, each on top of the other) image of the images.
"""
width = max(img.size[0] for img in images)
height = sum(img.size[1] for img in images)
image = Image.new(mode, (width, height), color)
left, upper = 0, 0
for img in images:
image.paste(img, (left, upper))
upper += img.size[1]
return image
if __name__=='__main__':
# Here's how it could be used:
from glob import glob
from optparse import OptionParser
# process command-line args
parser = OptionParser()
parser.add_option("-o", "--output", dest="file",
help="write combined image to OUTPUT")
options, filepatterns = parser.parse_args()
outfilename = options.file
filenames = []
for files in map(glob, filepatterns):
if files:
filenames += files
# construct image
images = map(Image.open, filenames)
img = makefilmstrip(images)
img.save(outfilename)
Exemple:
$ python filmstrip.py -o output.jpg *.jpg
Autres conseils
Je pense que si vous modifiez votre section essayez
en ceci:
filmstripimage.save(filmstrip_url, 'jpg', quality=90, optimize=1)
Dans le cas où vous ne plaisantez pas, le script pose plusieurs problèmes, par exemple: glob.glob ()
renvoie la liste des noms de fichiers (objets chaîne, pas d'objets image). Par conséquent, fichiers [0] .size [0]
ne fonctionnera pas.
comme l'a mentionné J. F. Sebastian, glob ne renvoie pas les objets de l'image ... mais aussi:
Dans l'état actuel des choses, le script suppose que les images du dossier ont toutes la même taille et la même forme. Ce n’est pas souvent une hypothèse sûre.
Donc, pour ces deux raisons, vous devez ouvrir les images avant de pouvoir déterminer leur taille. Une fois que vous l'ouvrez, vous devez définir la largeur et redimensionner les images à cette largeur afin qu'il n'y ait plus d'espace vide.
De plus, vous n'avez défini aucun nom de fichier miniature dans le script.