我的代码加载图像并尝试在某个纬度和经度上写一个正方形。它可以找到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
与网格产生相同的蓝色阴影。
我该如何解决这个问题?
非常感谢!!
答案 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")
<强>输出强>
PIL将上面的图片保存在P&#39; P&#39;模式,但256色调;我通过optipng传递它以将调色板优化为4种颜色,并改善压缩。