0

我正在尝试从文件中读取数据,例如:

    P3
    400 200
    255
    255 255 255
    0 255
    0
    0 0 0

而且我需要考虑前 4 个数字不是像素数据,而是创建图像的重要信息。我已经编写了下面的代码,但我不确定如何正确获取前 4 个数字,将它们用于我程序的不同部分,然后读取其余的图像数据。

4

1 回答 1

1

您正在进行微优化。将整个 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')]
于 2014-04-09T00:13:15.263 回答