Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用PIL制作拼贴_Python_Image_Python Imaging Library_Copy Paste - Fatal编程技术网

Python 用PIL制作拼贴

Python 用PIL制作拼贴,python,image,python-imaging-library,copy-paste,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",

我是。卡住了

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

这里有一些工作代码

  • 调用
    Image.open(p)
    时,返回一个Image对象,因此需要将than存储在变量中:
    im=Image.open(p)

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

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

  • 我将Picturewidth和Pictureheight重命名为thumbnail\u width和Thumnail\u height,以明确它们是什么,并遵循Python命名约定

  • 我还将列数和行数移动到变量中,这样就可以在没有幻数的情况下重用它们

  • 第一个循环将每个图像打开到一个
    im
    ,绘制缩略图并将其放入
    ims
    列表中

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

  • 第一个循环用于列(
    cols
    ),而不是像素(
    width
    )。(还有
    range(0,thing)
    的作用与
    range(thing)
    相同)

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

  • 在内部循环结束时,增加
    i
    计数器,并将
    缩略图高度添加到
    y

  • 同样,在外循环的末尾,将
    thumnnail_width
    添加到
    x
    并将
    y
    重置为零

  • 这些循环完成后,您只需保存一次
    new\u im

  • 不需要连接
    “Image2”+“.jpg”
    等,只需连接“Image2.jpg”

  • 这会导致如下结果:

    这段代码可以改进。例如,如果您不需要它们来做任何其他事情,则无需保存中间ImageX.jpg文件,而不是将这些文件名放在
    listofimages
    中,而是将图像直接放在那里:
    listofimages=[im、out1、out2等]
    ,然后将listofimages:
    中p的
    替换为listofimages:
    中im的
    并删除
    im=Image。打开(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)
    

    我明白了。漏洞。首先,#是注释的符号,而不是//。其次,循环是错误的:i应该在范围(0,a)内,而j应该在范围(0,b)内。没有检查其余的though@HennadiiMadan我用循环建议更新了shell上的代码,现在它只返回新创建图像最左侧的一张照片。我也一直在尝试任何新的方法来编写代码,但我仍然不知所措。还有什么建议吗?我想不出来我看到的第一个问题是
    create\u collage
    没有被调用。
    a
    b
    代表什么?我建议使用正确的变量名,而不是单个字母。@Nikki请根据Hugo的建议发布更新后的代码incorporated@Hugo我采纳了你的建议并编辑了我的代码。非常感谢。这正是我所需要的。我的图片显示了中间的黑色边框。有没有办法把它变成白色?@mango用白色而不是默认的黑色创建一个新的基础图像:
    new\u im=image.new('RGB',(宽度,高度),'white')