如何逐个像素地生成python中的图像?

时间:2013-06-27 04:37:46

标签: python python-imaging-library

我正在为我创建的使用0作为分隔符的图形格式编写图像生成器:

这是一个例子。 样本文件的摘录:

202000200030FFFF000F0122202071960104203023302024.....

打破这个

2 0 Version is 2 
200 0   Image Width is 200 pixels 
200 0   Image Height is 200 pixels 
3 0 There are 3 colours 
FFFF00 0    The first colour is FFFF00  
F01222 0    The second colour is F01222 
207196 0    The third colour is 207196 
104703023302024 ... This is the image 

然后打破图像位204703023302044:

2 0 Select Colour One
42 0    Draw 42 pixels
3 0 Select Colour Three
233 0   Draw 233 pixels
2 0 Select Colour Two
24 0    Draw 24 pixels

如何使用此格式逐像素生成图像?我会使用PIL,但我愿意接受建议。如果我要使用PIL那么我该怎么做?

3 个答案:

答案 0 :(得分:3)

您的方法称为行程编码或RLE。它被用作BMP格式的压缩方案。您可以在http://www.ptmcg.com/geo/python/bmp.py.txt找到一些简单的BMP文件存储(包括RLE)的Python实现。

但是对于分隔符选择'0'是令人困惑的。在您发布的示例中,您如何知道宽度为200像素?它可以是20像素,分隔符为0,或2像素,分隔符为0.或20002,分隔符为0.如果必须使用0作为分隔符,则使用另一个字符为0,可能是'z'或' _”。选择数据中不存在的分隔符,或者构造数据,以免与分隔符混淆。

答案 1 :(得分:2)

就个人而言,我会更改你的分隔符,因为你不知道0是分隔符还是值的一部分,你也应该使用固定数量的数字作为颜色值,可能指定为标题的一部分,之后这只是读取标题然后将数据读入数组并调用PIL.Image.fromarray来创建图像并从那里获取它。

答案 2 :(得分:1)

我更多地考虑了这一点,你的“0”分隔符可以工作,使用带有非消费前瞻的正则表达式。基本上,你的'0'分隔符是非零之前最右边的'0'。

为'0'分隔符定义一个正则表达式('0'后跟一个不是'0'或字符串结尾的东西)

>>> import re
>>> last_zero_delim = re.compile(r"0(?=[^0]|$)")

使用带有此模式的re.split来分解输入字符串

>>> z = '202000200030FFFF000F01222020719601042030233020240'
>>> re.split(last_zero_delim,z)
['2', '200', '200', '3', 'FFFF00', 'F', '1222', '2', '7196', '1', '42', '3', '233', '2', '24', '']

现在,您可以通过此列表处理像素计数和调色板索引。