2012-04-16 62 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: 我弄明白了。我应该在循环中交换我和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 2012-04-16 02:06:35

+0

是的,正如你所看到的,它是翻转(我,j)的顺序。 – tom10 2012-04-16 03:03:59

+0

请记住,尽管单独设置阵列中的像素是一个很好的开始位置,并且您可以通过不单独绘制像素来获得一些速度增益,但是如果将矢量化为循环,则会获得额外的速度增益。也就是说,使用numpy操作写这个,所以你没有做索引上的嵌套循环。 – tom10 2012-04-16 03:06:50