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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top