PIL ( pillow ) 不允许我在 .png 上每个像素写一个以上的值
PIL ( pillow ) won't let me write on a .png more than one value per pixel
我的代码加载了一张图片并尝试在特定的经纬度上写一个正方形。可以查到here. The picture is here.
实际问题可以在第26行找到:
pix [ lon + i, lat + j ] = 255, 0, 0
抛出此错误:
TypeError: function takes exactly 1 argument (3 given)
通过打印图像中的所有像素,PIL 出于某种原因将它们理解为 0s(白色)和 1s(蓝色)。这可以通过写来验证:
pix [ lon + i, lat + j ] = 1
产生与网格相同的蓝色阴影。
我该如何解决这个问题?
非常感谢!!
您的 PNG 文件是 palette-mapped 图像,因此您从 pix[x, y]
获得的数字是调色板编号,而不是 RGB 元组。也就是说,图像处于 'P' 模式,而不是 'RGB mode'。您可以将图像转换为 24 位 RGB 模式,例如通过执行
im = im.convert('RGB')
但是当您将结果保存到文件时,它将占用更多空间 space。
尽管 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' 模式保存了上面的图像,但使用了 256 色调色板;我通过 optipng 将调色板优化为 4 种颜色,并提高了压缩率。
我的代码加载了一张图片并尝试在特定的经纬度上写一个正方形。可以查到here. The picture is here.
实际问题可以在第26行找到:
pix [ lon + i, lat + j ] = 255, 0, 0
抛出此错误:
TypeError: function takes exactly 1 argument (3 given)
通过打印图像中的所有像素,PIL 出于某种原因将它们理解为 0s(白色)和 1s(蓝色)。这可以通过写来验证:
pix [ lon + i, lat + j ] = 1
产生与网格相同的蓝色阴影。
我该如何解决这个问题?
非常感谢!!
您的 PNG 文件是 palette-mapped 图像,因此您从 pix[x, y]
获得的数字是调色板编号,而不是 RGB 元组。也就是说,图像处于 'P' 模式,而不是 'RGB mode'。您可以将图像转换为 24 位 RGB 模式,例如通过执行
im = im.convert('RGB')
但是当您将结果保存到文件时,它将占用更多空间 space。
尽管 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' 模式保存了上面的图像,但使用了 256 色调色板;我通过 optipng 将调色板优化为 4 种颜色,并提高了压缩率。