2

我正在为我创建的使用 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,那我该怎么做?

4

3 回答 3

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' 或 ' _'。选择数据中不存在的定界符,或对数据进行结构化,以免与定界符混淆。

于 2013-06-27T06:01:57.683 回答
2

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

于 2013-06-27T04:51:04.280 回答
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', '']

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

于 2013-08-22T15:35:59.033 回答