2012-04-16 5 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 : 알아낼 수 있습니다. 나는 루프에서 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

관련 문제