在 PIL 中更新像素颜色后图像未保存
Image not saving after updating pixel color in PIL
我使用 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')
您需要将修改后的像素值复制回像素访问对象。例如,
if px[x, y] == (150, 150, 150):
px[x, y] = (0, 0, 255)
的旧 PIL 文档中有一个示例
如果您要修改大量像素,您可能希望使用 getdata() and putdata()。这些链接指向称为 Pillow 的新 PIL 分支的文档,但这些功能在旧 PIL 中也可用。
pixel = px[x, y]
if pixel == (150, 150, 150):
pixel = (0, 0, 255)
没有做你想做的事,因为 pixel = (0, 0, 255)
创建了一个新的元组并将其绑定到名称 pixel
,它没有修改 [=18= 处的 PixelAccess 对象中的元组].
元组是不可变的,所以它们不能被修改——如果你想改变它们,你需要用一个新的元组替换它们。 Python 是否允许您以 类似于 的方式修改 lists,因为列表 是 可变的。为了让它工作,我们需要使用列表的列表,我们不能使用简单的整数或字符串列表,因为 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
输出
[[0], [1], [7], [3], [4]]
现在a
没有变化。对 c
的赋值将一个新列表绑定到 c
,它不会触及 c
之前绑定到的 a[3]
对象。
有关此重要主题的更多信息,请参阅 SO 成员 Ned Batchelder 的精彩插图文章 Facts and myths about Python names and values。
我使用 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')
您需要将修改后的像素值复制回像素访问对象。例如,
if px[x, y] == (150, 150, 150):
px[x, y] = (0, 0, 255)
的旧 PIL 文档中有一个示例
如果您要修改大量像素,您可能希望使用 getdata() and putdata()。这些链接指向称为 Pillow 的新 PIL 分支的文档,但这些功能在旧 PIL 中也可用。
pixel = px[x, y]
if pixel == (150, 150, 150):
pixel = (0, 0, 255)
没有做你想做的事,因为 pixel = (0, 0, 255)
创建了一个新的元组并将其绑定到名称 pixel
,它没有修改 [=18= 处的 PixelAccess 对象中的元组].
元组是不可变的,所以它们不能被修改——如果你想改变它们,你需要用一个新的元组替换它们。 Python 是否允许您以 类似于 的方式修改 lists,因为列表 是 可变的。为了让它工作,我们需要使用列表的列表,我们不能使用简单的整数或字符串列表,因为 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
输出
[[0], [1], [7], [3], [4]]
现在a
没有变化。对 c
的赋值将一个新列表绑定到 c
,它不会触及 c
之前绑定到的 a[3]
对象。
有关此重要主题的更多信息,请参阅 SO 成员 Ned Batchelder 的精彩插图文章 Facts and myths about Python names and values。