2006-08-22 21:49:28 -04:00
|
|
|
|
|
|
|
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):
|
2006-08-29 20:19:25 -04:00
|
|
|
offset = y*width*bpp + x*bpp
|
2006-08-22 21:49:28 -04:00
|
|
|
r,g,b = self.GetRGB(x, y, bpp)
|
2006-08-29 20:19:25 -04:00
|
|
|
bytes[offset + 0] = r
|
|
|
|
bytes[offset + 1] = g
|
|
|
|
bytes[offset + 2] = b
|
2006-08-22 21:49:28 -04:00
|
|
|
|
|
|
|
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):
|
2006-08-29 20:19:25 -04:00
|
|
|
offset = y*width*bpp + x*bpp
|
2006-08-22 21:49:28 -04:00
|
|
|
r,g,b,a = self.GetRGB(x, y, bpp)
|
2006-08-29 20:19:25 -04:00
|
|
|
bytes[offset + 0] = r
|
|
|
|
bytes[offset + 1] = g
|
|
|
|
bytes[offset + 2] = b
|
|
|
|
bytes[offset + 3] = a
|
2006-08-22 21:49:28 -04:00
|
|
|
|
|
|
|
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
|
2006-08-27 05:11:47 -04:00
|
|
|
bytes = array.array('B', [0] * width*height*bpp)
|
2006-08-22 21:49:28 -04:00
|
|
|
|
|
|
|
for y in xrange(height):
|
|
|
|
for x in xrange(width):
|
2006-08-29 20:19:25 -04:00
|
|
|
offset = y*width*bpp + x*bpp
|
2006-08-22 21:49:28 -04:00
|
|
|
r,g,b = self.GetRGB(x, y, bpp)
|
2006-08-29 20:19:25 -04:00
|
|
|
bytes[offset + 0] = r
|
|
|
|
bytes[offset + 1] = g
|
|
|
|
bytes[offset + 2] = b
|
2006-08-22 21:49:28 -04:00
|
|
|
|
|
|
|
# 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:])
|
|
|
|
|