在PIL中制作拼贴画

pyt*_*bie 2 python image copy-paste python-imaging-library

我是。卡住。

我已经为此工作了一个多星期,而且似乎无法正常运行我的代码。我对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)
Run Code Online (Sandbox Code Playgroud)

Hug*_*ugo 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. 我也将列数和行数移到了变量中,这样就可以在没有幻数的情况下重用它们。

  6. 第一个循环将每个图像打开为im,将其缩略图化,然后将其放入的列表中ims

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

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

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

  10. 在内部循环的末尾,增加i计数器,然后添加thumbnail_heighty

  11. 类似地,在外环的端部,并添加thumnnail_widthx和复位y到零。

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

  13. 无需串联"Image2" + ".jpg"等,只需执行“ Image2.jpg”即可。

结果是这样的:

Collage.jpg

此代码可以改进。例如,如果您不需要它们,则无需保存中间ImageX.jpg文件,而不必将这些文件名放入其中,而是将listofimages图像直接放在这里:listofimages = [im, out1, out2, etc...],然后替换for p in listofimages:for im in listofimages:remove 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)
Run Code Online (Sandbox Code Playgroud)

  • @mango创建一个新的白色基础图像,而不是默认的黑色:`new_im = Image.new('RGB',(width,height),'white')` (2认同)