在PIL中制作拼贴

时间:2016-02-16 17:10:51

标签: python image python-imaging-library copy-paste

予。上午。卡住。

我已经在这方面工作了一个多星期了,我似乎无法让我的代码正确运行。我是PIL和Python的新手。我正在尝试制作一些2x3的拼贴画。我的代码如下所示。我试图让我的照片适合在新创建的拼贴中没有任何访问黑色空间,但是当我运行我的代码时,我只能将2张图片放入拼贴中,而不是我想要的6张。任何的意见都将会有帮助。

*已编辑代码

from PIL import Image
im= Image.open('Tulips.jpg')




out=im.convert("RGB", (
    0.412453, 0.357580, 0.180423, 0,
    0.212671, 0.715160, 0.072169, 0,
    0.019334, 0.119193, 0.950227, 0 ))
out.save("Image2" + ".jpg")

out2=im.convert("RGB", (
    0.9756324, 0.154789, 0.180423, 0,
    0.212671, 0.715160, 0.254783, 0,
    0.123456, 0.119193, 0.950227, 0 ))
out2.save("Image3" + ".jpg")



out3= im.convert("1")
out3.save("Image4"+".jpg")


out4=im.convert("RGB", (
    0.986542, 0.154789, 0.756231, 0,
    0.212671, 0.715160, 0.254783, 0,
    0.123456, 0.119193, 0.112348, 0 ))
out4.save("Image5" + ".jpg")


out5=Image.blend(im, out4, 0.5)
out5.save("Image6" + ".jpg")

listofimages=['Tulips.jpg', 'Image2.jpg', 'Image3.jpg', 'Image4.jpg', 'Image5.jpg', 'Image6.jpg']

def create_collage(width, height, listofimages):
    Picturewidth=width//3
    Pictureheight=height//2
    size=Picturewidth, Pictureheight
    new_im=Image.new('RGB', (450, 300))
    for p in listofimages:
        Image.open(p)
    for col in range(0,width):
        for row in range(0, height):
                image=Image.eval(p, lambda x: x+(col+row)/30)
                new_im.paste(p, (col,row))
                new_im.save("Collage"+".jpg")

create_collage(450,300,listofimages)

1 个答案:

答案 0 :(得分:6)

这是一些有效的代码。

  1. 当您致电Image.open(p)时,会返回一个Image对象,因此您需要存储而不是变量:im = Image.open(p)

  2. 我不确定image=Image.eval(p, lambda x: x+(col+row)/30)是什么意思,所以我删除了它。

  3. size是缩略图的大小,但您没有使用该变量。打开图片后,应将其调整为size

  4. 我将Picturewidth和Pictureheight重命名为thumbnail_width和thumbnail_height,以明确它们是什么,并遵循Python命名约定。

  5. 我还将cols和rows的数量移动到变量中,这样它们就可以在没有幻数的情况下重复使用。

  6. 第一个循环将每个图片打开为im,缩略图并将其放入ims列表中。

  7. 在下一个循环之前,我们初始化i, x , and y`变量以跟踪我们正在查看的图像,并使用x和y坐标将缩略图粘贴到更大的画布。它们将在下一个循环中更新。

  8. 第一个循环用于列(cols),而不是像素(width)。 (range(0, thing)也与range(thing)相同。)

  9. 类似地,第二个循环用于行而不是像素。在此循环中,我们将当前图片ims[i]粘贴到new_im处的大x, y。这些是像素位置,而不是行/列位置。

  10. 在内部循环结束时,递增i计数器,并将thumbnail_height添加到y

  11. 同样,在外部循环结束时,将thumnnail_width添加到x并将y重置为零。

  12. 在完成这些循环后,您只需要保存new_im一次。

  13. 不需要连接"Image2" + ".jpg"等,只需要“Image2.jpg”。

  14. 这导致如下:

    Collage.jpg

    此代码可以改进。例如,如果您不需要其他任何内容,则无需保存中间ImageX.jpg文件,而不是将这些文件名放在listofimages中,将图像直接放在那里:listofimages = [im, out1, out2, etc...] ,然后将for p in listofimages:替换为for im in listofimages:并删除im = Image.open(p)

    您还可以为图像计算一些填充,以便黑色空间均匀。

    from PIL import Image
    im= Image.open('Tulips.jpg')
    
    out=im.convert("RGB", (
        0.412453, 0.357580, 0.180423, 0,
        0.212671, 0.715160, 0.072169, 0,
        0.019334, 0.119193, 0.950227, 0 ))
    out.save("Image2.jpg")
    
    out2=im.convert("RGB", (
        0.9756324, 0.154789, 0.180423, 0,
        0.212671, 0.715160, 0.254783, 0,
        0.123456, 0.119193, 0.950227, 0 ))
    out2.save("Image3.jpg")
    
    out3= im.convert("1")
    out3.save("Image4.jpg")
    
    out4=im.convert("RGB", (
        0.986542, 0.154789, 0.756231, 0,
        0.212671, 0.715160, 0.254783, 0,
        0.123456, 0.119193, 0.112348, 0 ))
    out4.save("Image5.jpg")
    
    out5=Image.blend(im, out4, 0.5)
    out5.save("Image6.jpg")
    
    listofimages=['Tulips.jpg', 'Image2.jpg', 'Image3.jpg', 'Image4.jpg', 'Image5.jpg', 'Image6.jpg']
    
    def create_collage(width, height, listofimages):
        cols = 3
        rows = 2
        thumbnail_width = width//cols
        thumbnail_height = height//rows
        size = thumbnail_width, thumbnail_height
        new_im = Image.new('RGB', (width, height))
        ims = []
        for p in listofimages:
            im = Image.open(p)
            im.thumbnail(size)
            ims.append(im)
        i = 0
        x = 0
        y = 0
        for col in range(cols):
            for row in range(rows):
                print(i, x, y)
                new_im.paste(ims[i], (x, y))
                i += 1
                y += thumbnail_height
            x += thumbnail_width
            y = 0
    
        new_im.save("Collage.jpg")
    
    create_collage(450, 300, listofimages)