2012-10-02 6 views
3

우선 컨텍스트 비트입니다.numpy 배열의 서브 배열을 스왑합니다.

카이로 (실제로는 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에서 블리트 후) :-(스와핑 결과

.

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와를 수 사용하여 생각 : 나는 (내가 원하는대로) pixbufs를 계속 사용한다면, 나는 모든 세번째로 모든 1 바이트를 교환 데이터, 를 후 처리 할 필요가 나는 일반 파이썬에서 작업을 수행 할 수 있습니다 근심이있다 TER a는이 내장되어있는 경우 운영자과 같이 C. 뭔가 작성이를 위해 :

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

난 그냥 꿈이 있습니까? 주목 a

답변

5

B,G,R,A의 초기 (N,4) 배열, 당신은 단순히 몇 가지 고급 색인 사용 R,G,B,A(N,4) 표현을 얻을 수 :

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

그래를, 나는 시행 착오와 진행의 조합을 통해에 의해 자신이 발견 비슷한 질문이 여기에 있습니다. 그래도 고마워! 나를위한 – BehemothTheCat

+0

재 배열 = a [:, :, [2,1,0,3]]는 추가 모양 명령없이 작동했습니다. –

관련 문제