1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
import wx
import array
#----------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.width, self.height = 120,120
self.MakeBitmapRGB(self.width, self.height)
self.MakeBitmapRGBA(self.width, self.height)
self.MakeBitmapRGBpA(self.width, self.height)
def GetRGB(self, x, y, bpp):
# calculate some colour values for this sample based on x,y position
r = g = b = 0
if y < self.height/3: r = 255
if y >= self.height/3 and y <= 2*self.height/3: g = 255
if y > 2*self.height/3: b = 255
if bpp == 4:
a = int(x * 255.0 / self.width)
return r, g, b, a
else:
return r, g, b
def MakeBitmapRGB(self, width, height):
# Make a bitmap using an array of RGB bytes
bpp = 3 # bytes per pixel
bytes = array.array('B', [0] * width*height*bpp)
for y in xrange(height):
for x in xrange(width):
offset = y*width*bpp + x*bpp
r,g,b = self.GetRGB(x, y, bpp)
bytes[offset + 0] = r
bytes[offset + 1] = g
bytes[offset + 2] = b
self.rgbBmp = wx.BitmapFromBuffer(width, height, bytes)
def MakeBitmapRGBA(self, width, height):
# Make a bitmap using an array of RGBA bytes
bpp = 4 # bytes per pixel
bytes = array.array('B', [0] * width*height*bpp)
for y in xrange(height):
for x in xrange(width):
offset = y*width*bpp + x*bpp
r,g,b,a = self.GetRGB(x, y, bpp)
bytes[offset + 0] = r
bytes[offset + 1] = g
bytes[offset + 2] = b
bytes[offset + 3] = a
self.rgbaBmp = wx.BitmapFromBufferRGBA(width, height, bytes)
def MakeBitmapRGBpA(self, width, height):
# Make a bitmap using an array of RGB bytes plus a separate
# buffer for the alpha channel
bpp = 3 # bytes per pixel
bytes = array.array('B', [0] * width*height*bpp)
for y in xrange(height):
for x in xrange(width):
offset = y*width*bpp + x*bpp
r,g,b = self.GetRGB(x, y, bpp)
bytes[offset + 0] = r
bytes[offset + 1] = g
bytes[offset + 2] = b
# just use an alpha buffer with a constant alpha value for all
# pixels for this example, it could just as easily have
# varying alpha values like the other sample.
alpha = array.array('B', [128]*width*height)
self.rgbaBmp2 = wx.BitmapFromBuffer(width, height, bytes, alpha)
def DrawBitmapAndMessage(self, dc, bmp, msg, x_, y_):
x, y = x_, y_
# draw some text to help show the alpha
dc.SetFont(self.GetFont())
while y < y_ + self.height + 2*dc.GetCharHeight():
dc.DrawText(msg, x,y)
y += dc.GetCharHeight() + 5
# draw the bitmap over the text
dc.DrawBitmap(bmp, x+15,y_+15, True)
def OnPaint(self, evt):
dc = wx.PaintDC(self)
self.DrawBitmapAndMessage(dc, self.rgbBmp, "No alpha channel in this image", 30,35)
self.DrawBitmapAndMessage(dc, self.rgbaBmp, "This image has some alpha", 325,35)
self.DrawBitmapAndMessage(dc, self.rgbaBmp2,"This one made with RGB+A", 180,220)
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>BitmapFromBuffer</center></h2>
Two new wx.Bitmap factory functions allow you to create a wx.Bitmap
directly from a data buffer. The the buffer can be any Python object
that implements the buffer interface, or is convertable to a buffer,
such as a string or an array. The new functions are: <ul>
<li><b>wx.BitmapFromBuffer</b>(width, height, dataBuffer, alphaBuffer=None):
Creates the bitmap from a buffer of RGB bytes, optionally with a separate
buffer of alpha bytes.
<li><b>wx.BitmapFromBufferRGBA</b>(width, height, dataBuffer): Creates
the bitmap from a buffer containing RGBA bytes.
</ul>
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|