我正在尝试从文件中读取数据,例如:
P3
400 200
255
255 255 255
0 255
0
0 0 0
而且我需要考虑前 4 个数字不是像素数据,而是创建图像的重要信息。我已经编写了下面的代码,但我不确定如何正确获取前 4 个数字,将它们用于我程序的不同部分,然后读取其余的图像数据。
我正在尝试从文件中读取数据,例如:
P3
400 200
255
255 255 255
0 255
0
0 0 0
而且我需要考虑前 4 个数字不是像素数据,而是创建图像的重要信息。我已经编写了下面的代码,但我不确定如何正确获取前 4 个数字,将它们用于我程序的不同部分,然后读取其余的图像数据。
您正在进行微优化。将整个 PPM 图像读入字符串并不是“非常麻烦”。事实证明,我周围有一个 720x540 PPM,所以我用 Python 打开它:
Python 3.4.0 (default, Mar 17 2014, 23:20:09)
[GCC 4.8.2 20140206 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> with open('ppm/cake.ppm', 'r') as ppm:
... data = ppm.read()
...
由于我read
没有参数调用,data
现在包含整个图像作为字符串。请注意,这些命令会像往常一样立即执行。没有明显的放缓。我可以对它们执行正常操作:
>>> values = data.split()
>>> values[0]
'P3'
>>> values[1]
'720'
>>> values[2]
'540'
>>> values[3]
'255'
所以你可以看到它是一个 P3 编码的 PPM,720px 高,540px 宽。请注意,value[3:]
现在只包含颜色信息(而不是标题)。
即使我将信息量翻倍,也不会出现性能下降或滞后,无需采取任何特殊预防措施:
>>> values += values[3:]
>>> len(values)
2332805
在 Python 中,你可以做各种各样的事情来处理比这更大的数据(例如使用生成器),这段代码在两个台式机(年龄和硬件配置大不相同)、一台现代笔记本电脑上为我处理同样的事情,和一个虚拟机。简而言之,您无需担心此类预防措施。只需以简单的方式做事,然后继续使用您的 PPM 图像做一些很酷的事情。:)
编辑:
嘿,看,我确实找到了一些需要一秒钟的东西。一秒。
>>> encoding, height, width, *values = data.split()
>>> rgb = [tuple(values[i:i+3]) for i in range(0, len(values), 3)]
>>> rgb[:10]
[('255', '123', '125'), ('124', '124', '126'), ('125', '127', '129'), ('128', '129', '131'), ('130', '128', '130'), ('129', '126', '128'), ('127', '132', '134'), ('133', '132', '135'), ('134', '135', '140'), ('139', '137', '143')]