PIL(枕头)不允许我在每个像素上写一个.png多个值

时间:2018-02-05 15:00:39

标签: python pillow

我的代码加载图像并尝试在某个纬度和经度上写一个正方形。它可以找到here。图片为here

实际问题可以在第26行找到:

pix [ lon + i, lat + j ] = 255, 0, 0

这引发了这个错误:

TypeError: function takes exactly 1 argument (3 given)

通过打印图像中的所有像素,PIL由于某种原因将它们理解为0(白色)和1(蓝色)。这可以通过写作来验证:

pix [ lon + i, lat + j ] = 1

与网格产生相同的蓝色阴影。

我该如何解决这个问题?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

您的PNG文件是调色板映射的图像,因此从pix[x, y]获得的数字是调色板编号,而不是RGB元组。也就是说,图像在' P'模式,而不是' RGB模式'。您可以将图像转换为24位RGB模式,例如通过

im = im.convert('RGB')

但是当您将结果保存到文件时会占用更多空间。

虽然PNG支持多种256种颜色的调色板,但PIL希望调色板包含256种颜色。目前,PIL认为图像的调色板是白色,蓝色,黑色,其次是253个默认灰度值。要在另一种颜色上绘制图像,您需要先将该颜色添加到调色板中。这是一个简短的演示。

from PIL import Image

im = Image.open("grid.png")
pal = im.getpalette()

# Set palette number 3 color to red
palnum = 3
pal[3*palnum:3*palnum+3] = 255, 0, 0
# Attach new palette to image
im.putpalette(pal)

pix = im.load()

# Draw a red rectangle on image, pixel by pixel
lox, hix = 50, 100
loy, hiy = 100, 150
for y in range(loy, hiy):
    for x in range(lox, hix):
        pix[x, y] = palnum

im.show() 
im.save("new_grid.png")

<强>输出

test image with red rectangle

PIL将上面的图片保存在P&#39; P&#39;模式,但256色调;我通过optipng传递它以将调色板优化为4种颜色,并改善压缩。