【问题标题】:Making a collage in PIL在 PIL 中制作拼贴画
【发布时间】:2016-05-26 04:17:09
【问题描述】:

我。是。卡住。

我已经为此工作了一个多星期,但我似乎无法让我的代码正确运行。作为一个整体,我对 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)

【问题讨论】:

  • 我。看。错误。首先,# 是注释符号,而不是 //。其次,循环是错误的:i 应该在 (0,a) 范围内,而 j 在 (0,b) 范围内。虽然没有检查其余部分
  • @HennadiiMadan 我用循环建议更新了我的 shell 上的代码,现在它只返回新创建图像最左侧的一张照片。我也一直在想任何新的方法来编写代码,但我仍然不知所措。还有什么建议吗?我想不通
  • 我看到的第一个问题是create_collage 没有被调用。 ab 代表什么?我建议使用正确的变量名而不是单个字母。
  • @Nikki 请发布包含 Hugo 建议的更新代码
  • @Hugo 我采纳了你的建议并编辑了我的代码。

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


【解决方案1】:

这是一些工作代码。

  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] 的当前图像粘贴到x, y 的大new_im。这些是像素位置,而不是行/列位置。

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

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

  12. 在这些循环结束后,您只需保存一次new_im

  13. 无需连接"Image2" + ".jpg"等,只需“Image2.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)

【讨论】:

  • 非常感谢。这正是我所需要的。
  • 我的图片中间有黑色边框。有什么办法让它变白吗?
  • @mango 创建一个新的白色基础图像,而不是默认的黑色:new_im = Image.new('RGB', (width, height), 'white')
猜你喜欢
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2011-11-29
  • 2021-05-03
相关资源
最近更新 更多