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
我在做梦?
是啊,我发现这个自己通过试错和持续的组合类似的问题。虽然谢谢! – BehemothTheCat
对我来说rearranged = a [:,:,[2,1,0,3]]没有附加形状命令 –