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:]色情報のみが含まれていることに注意してください (ヘッダーは含まれません)。

情報量を 2 倍にしても、特別な予防策を講じなくても、パフォーマンスの低下や遅延は発生しません。

>>> values += values[3:]
>>> len(values)
2332805

これよりも大きなデータを Python で処理するためにできることはたくさんあります (たとえば、ジェネレーターを使用)。および仮想マシン。つまり、そのような予防措置について心配する必要はありません。簡単な方法で、PPM イメージで何かクールなことを始めましょう。:)

編集

ねえ、ほら、一瞬かかるものを見つけた2番目。

>>> 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 に答える