git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40921 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			149 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
 | 
						|
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:])
 | 
						|
 |