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()

多分一番汚いやり方

  1. get_dataで生データ取得(str)
  2. arrayでbyte配列に置換
  3. Cで1次元配列を2次元として扱うやり方( xチャネル数+色 + 幅y*チャネル数 )で座標指定
  4. chrで濃度から文字へ変換して代入
  5. tostring()でstrに戻す
  6. 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()

結果