2012-10-02 98 views
3

首先是一些背景。交換數組的陣列

我想繪製成與開羅 (實際pycairo)Gdk(實際pygtk)pixbuf。我原來的代碼是這樣的:

import cairo as C 
import gtk.gdk as GG 

FMT = C.FORMAT_ARGB32 
CSP = GG.COLORSPACE_RGB 

st = C.ImageSurface.format_stride_for_width(FMT, zw) 
surf = C.ImageSurface(FMT, zw, zh) 
c = C.Context(surf) 

# draw into c here ... 

pixels = surf.get_data() 
return GG.pixbuf_new_from_data(pixels, CSP, True, 8, zw, zh, st) 

一時間,它看起來像這將只是工作,直到我試圖繪製 顏色,而不只是黑色文本。原來,這兩個庫不同意 字節順序,像這樣:

# !!! FIXME !!! cairo ARGB surfaces and gdk pixbufs disagree on bytesex: 
# cairo: LSB --> B G R A <-- MSB 
# gdk: LSB --> R G B A <-- MSB 
# !!! WTF !!! 

結果是具有 紅色和藍色通道的圖像(從所述PIXBUF到屏幕位圖傳輸之後):-(交換

所以,如果我繼續使用pixbufs(我想)我需要後處理數據, 每3交換每1個字節我能做到這在普通的Python:

def changesex(data): 
    i0 = 0 
    i2 = 2 
    l = len(data) 
    while i2 < l: 
     temp = data[i0] 
     data[i0] = data[i2] 
     data[i2] = temp 
     i0 += 4 
     i2 += 4 

,但我想用numpy的可能是fas之三,如果有一個內置的 運營商這個用C寫的事情是這樣的:

a = np.frombuffer(data, dtype=np.uint8) 
a.shape = (len(data)/4, 4) 
temp = a[:,0] 
a[:,0] = a[:,2] 
a[:,2] = temp 

我在做夢?

回答

5

注意到a您最初的(N,4)陣列的B,G,R,A,你可以得到一個(N,4)表示爲R,G,B,A而簡單地使用一些高級的索引:

a = np.frombuffer(data, dtype=np.uint8) 
a.shape = (-1, 4) 
rearranged = a[:,[2,1,0,3]] 
+0

是啊,我發現這個自己通過試錯和持續的組合類似的問題。雖然謝謝! – BehemothTheCat

+0

對我來說rearranged = a [:,:,[2,1,0,3]]沒有附加形狀命令 –