2012-04-16 14 views
0

私はwxPythonを学習しています。私の質問はビットマップを作成する方法です。私は各ピクセルのR、G、B値を持っていますが、そこからビットマップを作成する方法はわかりません。私はwx.BitmapFromBufferを使用しようとしましたが、私はどのようにこのバッファを作成すべきか分かりません。私は各ピクセルを通って直線的な方法でリストR、G、B成分を入れましたが、私が期待したものを描画しませんでした。バッファーの構築方法を理解していますか?wxPython、ビットマップを作成

遅すぎるため、wx.MemoryDCを使用して各ピクセルをビットマップに描画したくありません。

ありがとうございました!

編集: 私はwxPythonのデモであるRawBitmapAccessのアプローチを使用しています。

buf = numpy.empty((w,h,3), numpy.uint8) 
    n = 29000 
    for i in xrange(w): 
     for j in xrange(h): 
      r = int(n*255*field[j,i]) 
      if r > 253: 
       r = 253 
      buf[i, j, 0] = int(r) 
      buf[i, j, 1] = int(r) 
      buf[i, j, 2] = int(b) 
      #dc.SetPen(wx.Pen(wx.Colour(r,r,b))) 
      #dc.DrawPoint(i,j) 
    bmp = wx.BitmapFromBuffer(w, h, buf) 
    gc = wx.GraphicsContext.Create(dc) 
    gc.DrawBitmap(bmp, 0, 0, w, h) 

私は描くの私の古い道(2ループ内の行をコメントし)、その後、私は私が欲しいものだコメントを解除した場合 - 1個のファジーボールを。私が奇妙な画像を持っているというコメントを外していないと、それはいくつかの断片のために垂直に分割されていて、それぞれはそれ自身のあいまいなボールを持っていて、欠落したピクセルの垂直線があるように見えます。 デモプログラムと同じ方法でバッファを使います。なぜ私は奇妙な画像を取得するのですか?

Edit2: 私はそれを理解します。私はループ内でiとjを入れ替えるべきです。

答えて

3

前回の回答で紹介したように、これはnumpyを使用して行われ、デモでRawBitmapAccessを呼び出す例があります。コードは基本的に

def MakeBitmap2(self, red, green, blue, alpha=128): 
    # Make an array of bytes that is DIM*DIM in size, with enough 
    # slots for each pixel to have a RGB and A value 
    #arr = makeByteArray((DIM,DIM, 4)) 
    arr = numpy.empty((DIM,DIM, 4), numpy.uint8) 

    # just some indexes to keep track of which byte is which 
    R, G, B, A = range(4) 

    # initialize all pixel values to the values passed in 
    arr[:,:,R] = red 
    arr[:,:,G] = green 
    arr[:,:,B] = blue 
    arr[:,:,A] = alpha 

    # Set the alpha for the border pixels to be fully opaque 
    arr[0,  0:DIM, A] = wx.ALPHA_OPAQUE # first row 
    arr[DIM-1, 0:DIM, A] = wx.ALPHA_OPAQUE # last row 
    arr[0:DIM, 0,  A] = wx.ALPHA_OPAQUE # first col 
    arr[0:DIM, DIM-1, A] = wx.ALPHA_OPAQUE # last col 

    # finally, use the array to create a bitmap 
    bmp = wx.BitmapFromBufferRGBA(DIM, DIM, arr) 
    return bmp 
+0

、のように見えるあなたは私の質問の更新時に見ることができるしてください – ashim

+0

はい、あなたが見るように、それは、(i、j)の順序を反転です。 – tom10

+0

配列のピクセルを個別に設定するのは良い場所ですが、ピクセルを個別に描画しないと速度が向上しますが、ループをベクトル化すると速度が向上します。つまり、numpy操作を使用してこれを書いて、インデックス上にネストされたループを持たないようにします。 – tom10

関連する問題