使用Python Imaging Library(PIL)通过输入像素值创建图像

11

我想用图像来实现一个创意,但是无法正确地写入像素值,它总是呈灰色,并带有一些像似的纹理,无论我尝试什么,这些图案都在变化,但图像始终保持灰色。

这是我拥有的基本代码:

from PIL import Image
data = ""
for i in range( 128**2 ):
    data += "(255,0,0),"
im = Image.fromstring("RGB", (128,128), data)
im.save("test.png", "PNG")

http://effbot.org/imagingbook/pil-index.htm 中没有关于如何格式化 data 的信息,因此我尝试使用 0-1、0-255、00000000-11111111(二进制)、括号、方括号、无括号、额外的 alpha 值以及将 RGB 更改为 RGBA(它会变成浅灰色但仅此而已),逗号之后或不加逗号,但绝对没有效果。

值得一提的是,我并不只想存储单个颜色,我只是这样做是为了最初让它工作。

1个回答

14

格式化字符串应该像这样排列:

"RGBRGBRGBRGB..."

其中R是表示特定像素的红色值的单个字符,G和B同理。

“但是255有三个字符长,如何将其转换为单个字符?”你问。使用chr将数字转换为字节值。

from PIL import Image
data = ""
for i in range( 128**2 ):
    data += chr(255) + chr(0) + chr(0)
im = Image.fromstring("RGB", (128,128), data)
im.save("test.png", "PNG")

结果:

在这里输入图片描述


另一种解决方案:

如果你的数据不是以那种格式存在的,使用fromstring生成图像是一个比较绕路的方法。相反,考虑使用Image.load直接操作像素值。然后你就不需要进行字符串转换了。

from PIL import Image

im = Image.new("RGB", (128, 128))
pix = im.load()
for x in range(128):
    for y in range(128):
        pix[x,y] = (255,0,0)

im.save("test.png", "PNG")

啊,非常感谢,运行得很好 :) 我的想法是打开一张图片,在保存数据之前修改每个像素的值(看到别人这样做觉得很有趣),所以我会尝试两种方法,看哪种方法效果最好。 - Peter
我认为对于大型图像来说,另一种解决方案会更加节省内存。 - Vlad E. Borovtsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接