バイナリファイル入出力に使用するメソッドは以下の通りです。
読み込んだバイナリの画像データを、半分の明るさにして出力するスクリプトです。
#!env python
import sys
import struct
infile = open(sys.argv[1], 'r')
outfile = open(sys.argv[2], 'w')
for i in range(3):
d = infile.readline()
outfile.write(d)
data = infile.read()
odata = ''
for i in range(len(data)/3):
r = ord(data[3*i])/2
g = ord(data[3*i+1])/2
b = ord(data[3*i+2])/2
odata += struct.pack('BBB', r, g, b)
outfile.write(odata)
infile.close()
outfile.close()
import struct
for i in range(3):
d = infile.readline()
outfile.write(d)
data = infile.read()
odata = ''
for i in range(len(data)/3):
r = ord(data[3*i])/2
g = ord(data[3*i+1])/2
b = ord(data[3*i+2])/2
odata += struct.pack('BBB', r, g, b)
outfile.write(odata)
RGBのデータをループによって計算するには、以下の方法もあります。
for rgb in zip(data[0::3], data[1::3], data[2::3]):
r = ord(rgb[0])/2
g = ord(rgb[1])/2
b = ord(rgb[2])/2
for rgb in zip(data[0::3], data[1::3], data[2::3]):
- 入力データから、RGBのデータを一つずつ取り出して、
リスト rgb に代入しながらループします。
rgb には、色データが文字になって並んでいます。
[赤の数値を表す文字, 緑の数値を表す文字, 青の数値を表す文字]
例えば、R が 97、G が 100、B が 120 という値だとすると、
97 は'a'、100 は 'd'、120 は 'x'という文字を表す数値なので、
rgb には以下のようにデータが代入されています。
['a', 'd', 'x']
r = ord(rgb[0])/2
g = ord(rgb[1])/2
b = ord(rgb[2])/2
- 文字データrgb[0], rgb[1], rgb[2]をord()によって数値に変換して計算を行います。
PPM ファイルフォーマット
バイナリデータのPPM画像ファイルは、
文字列3行分のヘッダと、それ以下のバイナリ画像データによって作られています。
- 1行目
- マジックナンバーを表す文字列'P6'
- 2行目
- 横•縦の解像度
例えば、横640ピクセル、縦480ピクセルならば
'640 480'
という文字列になります。
- 3行目
- 色数の最大値
例えば、各色データが1バイトで表される場合は'255'になります。
- 4行目
- 色データがバイナリで並ぶ
色数の最大値が255ならば、1バイトずつRGBの3バイトデータが必要な個数だけ並びます。
練習問題
- 読み込んだ2つのバイナリの画像データを、マスク画像によって合成して出力するスクリプト composite.py を作成してみましょう。
参考
- Maya
Maya, MEL, Maya関係のコマンドなどのページ。
- Python の変数
- PyOpenGL
PyOpenGL ホームページ。
- PyOpenGL リファレンス
Prev
index | home
abetmhr@gmail.com