4

私はPythonとPILが初めてです。PIL を介して Python に画像を読み込み、openGL を使用してそのピクセルを描画する方法について、コード サンプルをたどろうとしています。コードの一部を次に示します。

from Image import *
im = open("gloves200.bmp") 
pBits = im.convert('RGBA').tostring()

.....

glDrawPixels(200, 200, GL_RGBA, GL_UNSIGNED_BYTE, pBits)

これにより、キャンバス上に 200 x 200 ピクセルのパッチが描画されます。ただし、これは意図したイメージではありません。ランダム メモリからピクセルを描画しているように見えます。ランダム メモリ仮説は、まったく異なるイメージを描画しようとしても同じパターンが得られるという事実によって裏付けられています。誰か助けてもらえますか? Windows XP で Python 2.7 と pyopenGL および PIL の 2.7 バージョンを使用しています。

スクリーンショット

4

3 に答える 3

9

近かったと思います。試す:

pBits = im.convert("RGBA").tostring("raw", "RGBA")

RGBA rawmode パッカーを使用できるようにするには、まずイメージを RGBA モードに変換する必要があります ( libimagingの Pack.c を参照)。確認できますlen(pBits) == im.size[0]*im.size[1]*4。これは、gloves200 画像の 200x200x4 = 160,000 バイトです。

于 2011-07-20T06:57:55.030 に答える
1

tostring 関数内で直接変換を使用してみましたか?

im = open("test.bmp")
imdata = im.tostring("raw", "RGBA", 0, -1)
w, h = im.size[0], im.size[1]
glDrawPixels(w, h, GL_RGBA, GL_UNSIGNED_BYTE, imdata)

または、互換バージョンを使用します。

 try:
      data = im.tostring("raw", "BGRA")
 except SystemError:
      # workaround for earlier versions
      r, g, b, a = im.split()
      im = Image.merge("RGBA", (b, g, r, a))
于 2011-07-20T04:48:30.377 に答える
0

お手伝いありがとう。Web 上のサンプル コードを更新してくれた mikebabcock に感謝します。コード スニペットを提供してくれた eryksun に感謝します。コードで使用しました。

私は自分のエラーを見つけましたが、それは Python newb の間違いでした。ああ。モジュール内の関数のスコープ外でいくつかの変数を宣言し、単純に関数内でそれらの値を変更していると考えました。もちろん、それは機能しないため、私の glDrawPixels 呼び出しは実際にはランダムなメモリを描画していました。

于 2011-07-20T18:46:37.110 に答える