更新PIL中的像素颜色后图像不保存

时间:2015-05-19 12:02:49

标签: python python-2.7 python-imaging-library

我使用HuBarcode以PNG格式生成条形码图像,并修改它们以添加rgb(150, 150, 150)的边框,希望访问该颜色的像素以更改它们。我可以访问像素并通过print确认颜色正在被更改,但是当我打开图像文件时,没有任何变化。像素仍为rgb(150, 150, 150)。这是我正在使用的代码段。如果它有用,我可以添加更多代码:

def add_colored_border(self, barcode):
  img = Image.open(barcode)
  img = img.convert('RGB')
  px = img.load()
  for x in range(img.size[0]):
    for y in range(img.size[1]):
      pixel = px[x, y]
      if pixel == (150, 150, 150):  
        pixel = (0, 0, 255)
  img.save('testing.png')

1 个答案:

答案 0 :(得分:3)

您需要将修改后的像素值复制回像素访问对象。例如,

if px[x, y] == (150, 150, 150):
    px[x, y] = (0, 0, 255)

Image.load()的旧PIL文档中有一个示例。

如果您要修改大量像素,则可以使用getdata()putdata()。这些链接是PIL新分支的文档,称为Pillow,但这些函数也可以在旧的PIL中找到。

pixel = px[x, y]
if pixel == (150, 150, 150):  
    pixel = (0, 0, 255)

没有做你想做的事,因为pixel = (0, 0, 255)创建了一个新的元组并将其绑定到名称pixel,它不会修改PixelAccess对象中的元组px[x, y] 1}}。

元组是不可变的,因此无法修改 - 如果要更改它们,则需要用新元组替换它们。 Python 允许您以与您尝试的方式类似的方式修改列表,因为列表可变的。为了使这项工作,我们需要使用列表列表,我们不能使用简单的整数或字符串列表,因为Python整数和字符串是不可变的。

a = [[i] for i in range(5)]
print a
b = a[2]
print b
b[0] = 7
print b
print a

输出

[[0], [1], [2], [3], [4]]
[2]
[7]
[[0], [1], [7], [3], [4]]  

这是有效的,因为我正在修改b的内容。但是如果我做的话

c = a[3]
c = [11]
print a

**output**
[[0], [1], [7], [3], [4]]

现在a没有变化。对c的分配会将新列表绑定到c,但它不会触及a[3]之前绑定的c对象。

有关这一重要主题的更多信息,请参阅SO成员Ned Batchelder撰写的优秀插图文章Facts and myths about Python names and values