2008-12-03 61 views
3

我想写我的第一个真正的Python真正的功能。我想要完成的是搜索给定的文件夹,然后打开所有图像并将它们合并在一起,以便制作幻灯片图像。想象一下,将5幅图像叠加在彼此之上。如何完成这个python函数来保存在同一个文件夹中?

我现在有这样的代码,这应该是非常好的,但propably需要做一些修改:

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我加载图像?它可能有一些缺失或错误的东西,任何人都有线索?

相关问题:How to generate a filmstrip image in python from a folder of images?

+0

您忘记导入水珠(或忘了粘贴import语句) – Jiaaro 2008-12-03 00:37:10

+0

你忘了尝试运行代码至少一次 – nosklo 2008-12-03 01:24:18

回答

2

这不是一个回答你的问题,但它可能会有所帮助:

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

,如果你改变你的try节这个我想:

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

在这种情况下,你不是在开玩笑有几个问题,你的脚本如glob.glob()返回文件名列表(字符串对象,而不是图像对象),因此files[0].size[0]将不起作用。

1

为J. F.塞巴斯蒂安提到,水珠不会返回图像对象......但也:

因为它是现在,该脚本假设文件夹中的图像都是相同的大小和形状。这通常不是一个安全的假设。

因此,出于这两个原因,您需要先打开图像,然后才能确定其大小。一旦你打开它,你应该设置宽度,并缩放图像的宽度,所以没有空的空间。

另外,您没有在脚本的任何位置设置miniature_filename。

相关问题