Python pyglet - eiichiromomma/CVMLAB GitHub Wiki
Python) pyglet
(画像、動画の表示、音声の再生、OpenGLの描画を行なうライブラリ
ピクセル単位のアクセス
programming_guideを読んでいたら、pixelへのダイレクトなアクセスが可能との表記があったので試してみたメモ。
少し綺麗なやり方
''.join([list])
って方法があるらしい。
#!/usr/bin/env python
# ----------------------------------------------------------------------------
# pyglet
# Copyright (c) 2006-2008 Alex Holkner
# All rights reserved.
# ----------------------------------------------------------------------------
'''
'''
__docformat__ = 'restructuredtext'
__version__ = '$Id: image_viewer.py 1966 2008-03-23 07:01:26Z Alex.Holkner $'
import pyglet
window = pyglet.window.Window()
kitten = pyglet.image.load('kitten.jpg)').get_image_data()
data = kitten.get_data('RGB', kitten.width * 3)
tmplist = list(data)
for y in range(50, 100):
for x in range (150, 200):
for c in range (3):
#全色塗り潰し
tmplist[x*3+c + y*3*kitten.width] = chr(255)
#strに戻す
#data = ''.join(tmplist)
#データ書き込み
kitten.set_data('RGB', kitten.width * 3 , ''.join(tmplist))
@window.event
def on_draw():
window.clear()
kitten.blit(0, 0)
pyglet.app.run()
多分一番汚いやり方
- get_dataで生データ取得(str)
- arrayでbyte配列に置換
- Cで1次元配列を2次元として扱うやり方( xチャネル数+色 + 幅y*チャネル数 )で座標指定
- chrで濃度から文字へ変換して代入
- tostring()でstrに戻す
- set_dataで上書き
get_data, set_dataはsequence of bytes, or strを返す/渡すとあるのだが、綺麗なやり方が今のところ不明。
サンプル
ドキュメントのimage_viewer.pyが元ネタ
#!/usr/bin/env python
# ----------------------------------------------------------------------------
# pyglet
# Copyright (c) 2006-2008 Alex Holkner
# All rights reserved.
# ----------------------------------------------------------------------------
'''
'''
__docformat__ = 'restructuredtext'
__version__ = '$Id: image_viewer.py 1966 2008-03-23 07:01:26Z Alex.Holkner $'
import pyglet
import array
window = pyglet.window.Window()
#image = pyglet.resource.image('kitten.jpg)')
#resouce.image の代わりにimage.loadでget_image_data
kitten = pyglet.image.load('kitten.jpg)').get_image_data()
data = kitten.get_data('RGB', kitten.width * 3)
#Byteのarrayに変換
bdata = array.array('c',data)
for y in range(50, 100):
for x in range (150, 200):
for c in range (3):
#全色塗り潰し
bdata[x*3+c + y*3*kitten.width] = chr(255)
#strに戻す
sdata = bdata.tostring()
#データ書き込み
kitten.set_data('RGB', kitten.width * 3 , sdata)
@window.event
def on_draw():
window.clear()
# image.blit(0, 0)
kitten.blit(0, 0)
pyglet.app.run()