Skip to main content
 首页 » 编程设计

python之使用 PIL,如何在使用 .load() 后保存经过处理的图像

2025年05月04日8youxin

如何从使用 image.load() 操作的数据中保存图像文件?

这是我的代码,用于合并两张相同大小的图片

from PIL import Image 
import random 
 
image1 = Image.open("me.jpg") 
image2 = Image.open("otherme.jpg") 
 
im1 = image1.load() 
im2 = image2.load() 
 
width, height = image1.size 
 
newimage = Image.new("RGB",image1.size) 
newim = newimage.load() 
 
xx = 0 
yy = 0 
 
while xx < width: 
    while yy < height: 
        if random.randint(0,1) == 1: 
            newim[xx,yy] = im1[xx,yy] 
        else: 
            newim[xx,yy] = im2[xx,yy] 
        yy = yy+1 
    xx = xx+1 
 
newimage.putdata(newim) 
newimage.save("new.jpg") 

当我运行它时,我得到了这个错误。

Traceback (most recent call last): 
 File "/home/dave/Desktop/face/squares.py", line 27, in <module> 
newimage.putdata(newim) 
 File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1215, in putdata 
self.im.putdata(data, scale, offset) 
TypeError: argument must be a sequence 

使用 .load() 生成的字典不是一个序列吗?我在谷歌上找不到其他人有这个问题。

请您参考如下方法:

load 返回的字典(实际上不是字典)是图像中的数据。您不必使用 putdata 重新加载它。只需删除该行即可。

此外,使用 for 循环代替 while 循环:

for xx in range(0, width): 
    for yy in range(0, height): 
        if random.randint(0,1) == 1: 
            newim[xx,yy] = im1[xx,yy] 
        else: 
            newim[xx,yy] = im2[xx,yy] 

现在不需要初始化和递增 xx 和 yy。

你甚至可以使用 itertools.product:

for xx, yy in itertools.product(range(0, width), range(0, height)): 
    if random.randint(0,1) == 1: 
        newim[xx,yy] = im1[xx,yy] 
    else: 
        newim[xx,yy] = im2[xx,yy]