我正在为我创建的使用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那么我该怎么做?
答案 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', '']
现在,您可以通过此列表处理像素计数和调色板索引。