Как завершить эту функцию Python, чтобы сохранить в той же папке? - PullRequest
3 голосов
/ 03 декабря 2008

Я пытаюсь написать свою первую настоящую функцию Python, которая делает что-то реальное. То, что я хочу сделать, это поиск в данной папке, а затем открыть все изображения и объединить их вместе, чтобы они сделали изображение диафильма. Представьте себе 5 изображений, расположенных друг над другом на одном изображении.

Теперь у меня есть этот код, который должен быть почти нормальным, но, вероятно, нуждается в некоторой модификации:

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)")

Как мне изменить это так, чтобы он сохранял новый filmstrip.jpg в том же каталоге, из которого я загружал изображения? И, вероятно, есть некоторые вещи, которые отсутствуют или не правы, кто-нибудь есть ключ?

Смежный вопрос: Как создать изображение киноленты в python из папки изображений?

Ответы [ 4 ]

2 голосов
/ 03 декабря 2008

Это не ответ на ваш вопрос, но может быть полезно:

#!/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) 

Пример:

$ python filmstrip.py -o output.jpg *.jpg
1 голос
/ 03 декабря 2008

В случае, если вы не шутите, есть несколько проблем с вашим скриптом, например glob.glob() возвращает список имен файлов (строковые объекты, а не объекты изображений), поэтому files[0].size[0] не будет работать.

1 голос
/ 03 декабря 2008

, как упоминал Дж. Ф. Себастьян, glob не возвращает объекты изображения ... но также:

Как и сейчас, скрипт предполагает, что изображения в папке имеют одинаковый размер и форму. Это не часто безопасное предположение.

Так что по обеим этим причинам вам необходимо открыть изображения, прежде чем вы сможете определить их размер. Открыв его, вы должны установить ширину и масштабировать изображения до этой ширины, чтобы не было пустого пространства.

Кроме того, вы нигде не указали имя миниатюрного_файла в скрипте.

1 голос
/ 03 декабря 2008

Я думаю, что если вы измените свой try раздел на этот:

filmstripimage.save(filmstrip_url, 'jpg', quality=90, optimize=1)
...