在PIL中更新像素颜色后图像未保存

2024-05-16 04:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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')

Tags: 代码inimgforsizepng颜色格式
1条回答
网友
1楼 · 发布于 2024-05-16 04:10:31

您需要将修改后的像素值复制回pixel access对象中。例如

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

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

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


^{pr2}$

不执行您想要的操作,因为pixel = (0, 0, 255)创建了一个新的元组并将其绑定到名称pixel,它不会修改位于px[x, y]的PixelAccess对象中的元组。在

元组是不可变的,所以它们不能被修改——如果你想改变它们,你需要用一个新的元组来替换它们。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,它不涉及c以前绑定到的a[3]对象。在

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

相关问题 更多 >