2016-02-16 23 views
2

I. Am。卡住。在PIL中制作拼贴画

我一直在这一个多星期了,我似乎无法让我的代码才能正确运行。作为一个整体,我对PIL和Python相当陌生。我正在尝试制作一些2x3拼贴图片。我有我的代码列在下面。我试图让我的照片适合在新创建的拼贴中没有任何访问空格,但是当我运行我的代码时,我只能将2张照片放入拼贴中,而不是我想要的6张。任何的意见都将会有帮助。

* CODE EDITED

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) 
+0

I.参见。错误。 首先,#是评论的符号,而不是//。 其次,循环是错误的:我应该在范围(0,a)而j在范围内(0,b)。 虽然没有检查其余部分 –

+0

@HennadiiMadan我使用循环建议更新了我的shell的代码,现在它只返回新创建映像最左侧的一张照片。我也一直试图想出任何编写代码的新方法,但我仍然处于困境。还有什么建议?我无法弄清楚 –

+0

我看到的第一个问题是'create_collage'没有被调用。 “a”和“b”意味着什么?我建议适当的变量名称而不是单个字母。 – Hugo

回答

3

这里的一些工作的代码。

  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和行数变量,使他们可以在没有幻数被重复使用。

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

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

  8. 第一个循环用于列(cols),而不是像素(width)。 (另外range(0, thing)range(thing)的做法相同。)

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

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

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

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

  13. 没有必要连接"Image2" + ".jpg"等,只是做“Image2.jpg”。

这导致这样的事情:

Collage.jpg

这个代码可以改善。例如,如果你不需要他们为别的,就没有必要保存中间ImageX.jpg文件,而不是把那些文件名中listofimages,把图像直接有:listofimages = [im, out1, out2, etc...],然后用for im in listofimages:取代for p 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) 
+1

非常感谢。这正是我需要的。 –

+0

非常感谢你,你救了我的一天! – exrezzo