diff --git a/demo/Image.py b/demo/Image.py index 678fecbb..995d3713 100644 --- a/demo/Image.py +++ b/demo/Image.py @@ -1,45 +1,290 @@ #!/usr/bin/env python -import wx +import os +from collections import OrderedDict +import wx +import wx.lib.scrolledpanel as scrolled from Main import opj +# IMG_QUALITY = wx.IMAGE_QUALITY_NORMAL +IMG_QUALITY = wx.IMAGE_QUALITY_HIGH + +supportedBitmapTypes = OrderedDict([ +(wx.BITMAP_TYPE_ANI , 'BITMAP_TYPE_ANI: Load a Windows animated cursor file (ANI).'), +(wx.BITMAP_TYPE_BMP , 'BITMAP_TYPE_BMP: Load a Windows bitmap file.'), +(wx.BITMAP_TYPE_CUR , 'BITMAP_TYPE_CUR: Load a Windows cursor file (CUR).'), +(wx.BITMAP_TYPE_GIF , 'BITMAP_TYPE_GIF: Load a GIF bitmap file.'), +(wx.BITMAP_TYPE_ICO , 'BITMAP_TYPE_ICO: Load a Windows icon file (ICO).'), +(wx.BITMAP_TYPE_JPEG , 'BITMAP_TYPE_JPEG: Load a JPEG bitmap file.'), +(wx.BITMAP_TYPE_PCX , 'BITMAP_TYPE_PCX: Load a PCX bitmap file.'), +(wx.BITMAP_TYPE_PNG , 'BITMAP_TYPE_PNG: Load a PNG bitmap file.'), +(wx.BITMAP_TYPE_PNM , 'BITMAP_TYPE_PNM: Load a PNM bitmap file.'), +(wx.BITMAP_TYPE_TGA , 'BITMAP_TYPE_TGA: Load a TGA bitmap file.'), +(wx.BITMAP_TYPE_TIFF , 'BITMAP_TYPE_TIFF: Load a TIFF bitmap file.'), +(wx.BITMAP_TYPE_XPM , 'BITMAP_TYPE_XPM: Load a XPM bitmap file.'), +(wx.BITMAP_TYPE_ANY , 'BITMAP_TYPE_ANY: Will try to autodetect the format.'), +]) + +description = """\ +This sample demonstrates some of the capabilities of the wx.Image class, both the +variety of source image formats, and some of the operations that can be performed +on an image object. +""" + #---------------------------------------------------------------------- +class ImagePanel(scrolled.ScrolledPanel): + defBackgroundColour = '#FFBB66' + + def __init__(self, parent, id=wx.ID_ANY): + scrolled.ScrolledPanel.__init__(self, parent, id) + # self.log = log + # self.SetDoubleBuffered(True) + + hdrFont = wx.Font(18, wx.FONTFAMILY_DEFAULT, + wx.FONTSTYLE_NORMAL, + wx.FONTWEIGHT_BOLD) + + StatText1 = wx.StaticText(self, wx.ID_ANY, 'wx.Image',) + StatText1.SetFont(wx.Font(wx.FontInfo(24).Bold())) + + StatText2 = wx.StaticText(self, wx.ID_ANY, 'Supported Bitmap Types') + StatText2.SetFont(hdrFont) + + vsizer0 = wx.BoxSizer(wx.VERTICAL) + vsizer0.Add(StatText1, 0, wx.ALL|wx.ALIGN_CENTER, 10) + vsizer0.Add(wx.StaticText(self, wx.ID_ANY, description), + 0, wx.LEFT|wx.BOTTOM, 10) + vsizer0.Add(StatText2, 0, wx.ALL, 10) + + fgsizer1 = wx.FlexGridSizer(cols=2, vgap=10, hgap=10) + fgsizer1.AddGrowableCol(0) + bmp = wx.Image(opj('bitmaps/image.bmp'), wx.BITMAP_TYPE_BMP) + gif = wx.Image(opj('bitmaps/image.gif'), wx.BITMAP_TYPE_GIF) + png = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG) + jpg = wx.Image(opj('bitmaps/image.jpg'), wx.BITMAP_TYPE_JPEG) + ico = wx.Image(opj('bitmaps/image.ico'), wx.BITMAP_TYPE_ICO) + tif = wx.Image(opj('bitmaps/image.tif'), wx.BITMAP_TYPE_TIF) + dict = OrderedDict([ + (bmp, 'bmp\n*.bmp;*rle;*dib'), + (gif, 'gif\n*.gif'), + (png, 'png\n*.png'), + (jpg, 'jpg\n*.jpg;*.jpeg;*.jpe'), + (ico, 'ico\n*.ico'), + (tif, 'tif\n*.tif;*.tiff'), + ]) + for bmpType, tip in list(dict.items()): + statBmp = wx.StaticBitmap(self, wx.ID_ANY, bmpType.ConvertToBitmap()) + type = bmpType.GetType() + if type in supportedBitmapTypes: + typeStr = 'wx.' + supportedBitmapTypes[type][:supportedBitmapTypes[type].find(':')] + statText = wx.StaticText(self, -1, typeStr) + fgsizer1.Add(statText) + fgsizer1.Add(statBmp) + + vsizer0.Add(fgsizer1, 0, wx.LEFT, 25) + vsizer0.AddSpacer(35) + + StatText3 = wx.StaticText(self, wx.ID_ANY, 'Basic Image Manipulation Operations') + StatText3.SetFont(hdrFont) + vsizer0.Add(StatText3, 0, wx.LEFT|wx.BOTTOM, 10) + + + self.imgPath = 'bitmaps/image.png' + self.imgType = wx.BITMAP_TYPE_ANY + self.fgsizer2 = fgsizer2 = wx.FlexGridSizer(cols=2, vgap=10, hgap=10) + fgsizer2.AddGrowableCol(0) + + self.colorbutton = wx.ColourPickerCtrl(self, wx.ID_ANY, + size=(175, -1), + style=wx.CLRP_USE_TEXTCTRL) + self.colorbutton.Bind(wx.EVT_COLOURPICKER_CHANGED, self.ChangePanelColor) + vsizer1 = wx.BoxSizer(wx.VERTICAL) + vsizer1.Add(wx.StaticText(self, -1, "Panel colour:")) + vsizer1.Add(self.colorbutton, 0, wx.LEFT, 15) + fgsizer2.Add(vsizer1) + + + self.SetBackgroundColour(self.defBackgroundColour) + self.colorbutton.SetColour(self.defBackgroundColour) + self.colorbutton.SetToolTip('Change Panel Color') + + self.filebutton = wx.FilePickerCtrl(self, wx.ID_ANY, + path=os.path.abspath(opj(self.imgPath)), + message='', + wildcard=wx.Image.GetImageExtWildcard(), + style=wx.FLP_OPEN + | wx.FLP_FILE_MUST_EXIST + | wx.FLP_USE_TEXTCTRL + | wx.FLP_CHANGE_DIR + # | wx.FLP_SMALL + ) + self.filebutton.SetToolTip('Browse for a image to preview modifications') + self.filebutton.Bind(wx.EVT_FILEPICKER_CHANGED, self.ChangeModdedImages) + vsizer2 = wx.BoxSizer(wx.VERTICAL) + vsizer2.Add(wx.StaticText(self, -1, "Load test image:")) + vsizer2.Add(self.filebutton, 0, wx.EXPAND|wx.LEFT, 15) + fgsizer2.Add(vsizer2, 0, wx.EXPAND) + + fgsizer2.AddSpacer(10) + fgsizer2.AddSpacer(10) + + def getImg(): + # Start with a fresh copy of the image to mod. + path = opj(self.imgPath) + type = self.imgType + return wx.Image(path, type) + + self.allModdedStatBmps = [] + self.img = getImg() + self.imgWidth = getImg().GetWidth() + self.imgHeight = getImg().GetHeight() + self.imgCenterPt = wx.Point(self.imgWidth//2, self.imgHeight//2) + + imgBmp = wx.StaticBitmap(self, wx.ID_ANY, self.img.ConvertToBitmap()) + fgsizer2.Add(wx.StaticText(self, -1, "Original test image:")) + fgsizer2.Add(imgBmp) + self.allModdedStatBmps.append(imgBmp) + + self.DoImageMods() + + dict = OrderedDict([ + (self.greyscale , 'img.ConvertToGreyscale()'), + (self.disabled , 'img.ConvertToDisabled()'), + (self.mono , 'img.ConvertToMono(r=255, g=255, b=255)'), + (self.mask , 'img.SetMaskColour(\n\tred=255, green=255, blue=255)'), + (self.blur , 'img.Blur(blurRadius=3)'), + (self.blurH , 'img.BlurHorizontal(blurRadius=3)'), + (self.blurV , 'img.BlurVertical(blurRadius=3)'), + (self.mirrorH , 'img.Mirror(horizontally=True)'), + (self.mirrorV , 'img.Mirror(horizontally=False)'), + (self.mirrorBoth , 'img.Mirror(horizontally=True).\n\tMirror(horizontally=False)'), + (self.adjustChan , 'img.AdjustChannels(factor_red=2.0,\n\tfactor_green=1.0,\n\tfactor_blue=1.0,\n\tfactor_alpha=1.0)'), + (self.rotate , 'img.Rotate(angle=45.0,\n\trotationCentre=imgCenterPt,\n\tinterpolating=True,\n\toffsetAfterRotation=None)'), + (self.rotate90 , 'img.Rotate90(clockwise=True)'), + (self.rotate180 , 'img.Rotate180()'), + (self.replace , 'img.Replace(r1=0, g1=0, b1=0,\n\tr2=0, g2=255, b2=0)'), + (self.scale , 'img.Scale(width=128, height=32,\n\tquality=wx.IMAGE_QUALITY_NORMAL)'), + (self.rescale , 'img.Rescale(width=128, height=32,\n\tquality=wx.IMAGE_QUALITY_NORMAL)'), + (self.resize , 'img.Resize(size=(256 + 16, 64 + 8),\n\tpos=(0+8, 0+4),\n\tred=0, green=0, blue=255)'), + (self.paste , 'img.Paste(image=getImg(), x=16, y=16)'), + (self.rotatehue , 'img.RotateHue(0.5)'), + ]) + + for imgModification, tip in list(dict.items()): + statBmp = wx.StaticBitmap(self, wx.ID_ANY, + imgModification.ConvertToBitmap()) + self.allModdedStatBmps.append(statBmp) + tip = tip.replace('\t', ' '*8) + statText = wx.StaticText(self, -1, tip) + fgsizer2.Add(statText) #, 0, wx.ALL | wx.EXPAND | wx.ALIGN_CENTER, 5) + fgsizer2.Add(statBmp)#, 0, wx.ALL, 5) + + vsizer0.Add(fgsizer2, 0, wx.LEFT, 25) + self.SetSizer(vsizer0) + self.SetupScrolling() + + + def getImg(self): + # Start with a fresh copy of the image to mod. + path = opj(self.filebutton.GetPath()) + type = self.imgType + return wx.Image(path, type) + + + def DoImageMods(self): + getImg = self.getImg # local opt + self.greyscale = getImg().ConvertToGreyscale() + self.disabled = getImg().ConvertToDisabled() + self.mono = getImg().ConvertToMono(r=255,g=255,b=255) + self.maskIMG = getImg() + self.maskIMG.SetMaskColour(red=255,green=255,blue=255) + self.mask = self.maskIMG + self.blur = getImg().Blur(blurRadius=3) + self.blurH = getImg().BlurHorizontal(blurRadius=3) + self.blurV = getImg().BlurVertical(blurRadius=3) + self.mirrorH = getImg().Mirror(horizontally=True) + self.mirrorV = getImg().Mirror(horizontally=False) + self.mirrorBoth = getImg().Mirror(True).Mirror(False) + self.adjustChan = getImg().AdjustChannels(factor_red=2.0, + factor_green=1.0, + factor_blue=1.0, + factor_alpha=1.0) + self.rotate = getImg().Rotate(angle=45.0, + rotationCentre=self.imgCenterPt, + interpolating=True, + offsetAfterRotation=None) + self.rotate90 = getImg().Rotate90(clockwise=True) + self.rotate180 = getImg().Rotate180() + self.replaceIMG = getImg() + self.replaceIMG.Replace(r1=0, g1=0, b1=0, r2=0, g2=255, b2=0) + self.replace = self.replaceIMG + self.scale = getImg().Scale(width=128, height=32, quality=IMG_QUALITY) + self.rescale = getImg().Rescale(width=128, height=32, quality=IMG_QUALITY) + self.resize = getImg().Resize(size=(256 + 16, 64 + 8), + pos=(0+8, 0+4), red=0, green=0, blue=255) + self.pasteIMG = getImg() + self.pasteIMG.Paste(image=getImg(), x=16, y=16) + self.paste = self.pasteIMG + self.rotatehueIMG = getImg() + self.rotatehueIMG.RotateHue(0.5) + self.rotatehue = self.rotatehueIMG + + def ChangePanelColor(self, event): + color = event.GetColour() + self.SetBackgroundColour(color) + self.Refresh() + + def ChangeModdedImages(self, event=None): + self.img = img = self.getImg() + self.imgWidth = img.GetWidth() + self.imgHeight = img.GetHeight() + self.imgCenterPt = wx.Point(self.imgWidth//2, self.imgHeight//2) + + self.DoImageMods() + + list = [self.img , + self.greyscale , + self.disabled , + self.mono , + self.mask , + self.blur , + self.blurH , + self.blurV , + self.mirrorH , + self.mirrorV , + self.mirrorBoth , + self.adjustChan , + self.rotate , + self.rotate90 , + self.rotate180 , + self.replace , + self.scale , + self.rescale , + self.resize , + self.paste , + self.rotatehue + ] + + for imgModification in range(len(list)): + self.allModdedStatBmps[imgModification].SetBitmap(list[imgModification].ConvertToBitmap()) + self.fgsizer2.RecalcSizes() + self.PostSizeEvent() + + +class TestPanel(wx.Panel): + def __init__(self, parent, log): + self.log = log + wx.Panel.__init__(self, parent, -1) + + vsizer = wx.BoxSizer(wx.VERTICAL) + vsizer.Add(ImagePanel(self), 1, wx.EXPAND | wx.ALL, 0) + self.SetAutoLayout(1) + self.SetSizer(vsizer) + def runTest(frame, nb, log): - bmp = wx.Image(opj('bitmaps/image.bmp'), wx.BITMAP_TYPE_BMP).ConvertToBitmap() - gif = wx.Image(opj('bitmaps/image.gif'), wx.BITMAP_TYPE_GIF).ConvertToBitmap() - png = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG).ConvertToBitmap() - jpg = wx.Image(opj('bitmaps/image.jpg'), wx.BITMAP_TYPE_JPEG).ConvertToBitmap() - - panel = wx.Panel(nb, -1) - - pos = 10 - wx.StaticBitmap(panel, -1, bmp, (10, pos)) - - pos = pos + bmp.GetHeight() + 10 - wx.StaticBitmap(panel, -1, gif, (10, pos)) - - pos = pos + gif.GetHeight() + 10 - wx.StaticBitmap(panel, -1, png, (10, pos)) - - pos = pos + png.GetHeight() + 10 - wx.StaticBitmap(panel, -1, jpg, (10, pos)) - - - greyscale = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG).ConvertToGreyscale().ConvertToBitmap() - disabled = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG).ConvertToDisabled().ConvertToBitmap() - mono = wx.Image(opj('bitmaps/image.png'), wx.BITMAP_TYPE_PNG).ConvertToMono(0,255,255).ConvertToBitmap() - - pos = 10 - wx.StaticBitmap(panel, -1, greyscale, (320, pos)) - - pos = pos + greyscale.GetHeight() + 10 - wx.StaticBitmap(panel, -1, disabled, (320, pos)) - - pos = pos + disabled.GetHeight() + 10 - wx.StaticBitmap(panel, -1, mono, (320, pos)) - + panel = TestPanel(nb, log) return panel @@ -50,18 +295,18 @@ def runTest(frame, nb, log): overview = """\ -This class encapsulates a platform-independent image. An image can be created -from data, or using wxBitmap.ConvertToImage. An image can be loaded from -a file in a variety of formats, and is extensible to new formats via image -format handlers. Functions are available to set and get image bits, so it can -be used for basic image manipulation. +This class encapsulates a platform-independent image. An image can be created + from data, or using wxBitmap.ConvertToImage. An image can be loaded + from a file in a variety of formats, and is extensible to new formats via image + format handlers. Functions are available to set and get image bits, so it can + be used for basic image manipulation. -

The following image handlers are available. wxBMPHandler is always installed -by default. To use other image formats, install the appropriate handler or use +

The following image handlers are available. wxBMPHandler is always installed + by default. To use other image formats, install the appropriate handler or use wx.InitAllImageHandlers().

- +
@@ -70,17 +315,17 @@ by default. To use other image formats, install the appropriate handler or use - +
wxBMPHandler For loading and saving, always installed.
wxPNGHandler For loading and saving.
wxJPEGHandler For loading and saving.
wxPNMHandler For loading and saving.
wxTIFFHandler For loading and saving.
wxIFFHandler For loading only.
wxXPMHandler For loading and saving.
wxXPMHandler For loading and saving.
wxICOHandler For loading and saving.
wxCURHandler For loading and saving.
wxANIHandler For loading only.
-

When saving in PCX format, wxPCXHandler will count the number of different -colours in the image; if there are 256 or less colours, it will save as 8 bit, +

When saving in PCX format, wxPCXHandler will count the number of different +colours in the image; if there are 256 or less colours, it will save as 8 bit, else it will save as 24 bit. -

Loading PNMs only works for ASCII or raw RGB images. When saving in PNM format, +

Loading PNMs only works for ASCII or raw RGB images. When saving in PNM format, wxPNMHandler will always save as raw RGB. diff --git a/demo/bitmaps/image.bmp b/demo/bitmaps/image.bmp index bbab4cd3..3d945877 100644 Binary files a/demo/bitmaps/image.bmp and b/demo/bitmaps/image.bmp differ diff --git a/demo/bitmaps/image.gif b/demo/bitmaps/image.gif index 34b3e035..1e95fd66 100644 Binary files a/demo/bitmaps/image.gif and b/demo/bitmaps/image.gif differ diff --git a/demo/bitmaps/image.ico b/demo/bitmaps/image.ico new file mode 100644 index 00000000..1137baf9 Binary files /dev/null and b/demo/bitmaps/image.ico differ diff --git a/demo/bitmaps/image.jpg b/demo/bitmaps/image.jpg index 8ec8f487..52ce208f 100644 Binary files a/demo/bitmaps/image.jpg and b/demo/bitmaps/image.jpg differ diff --git a/demo/bitmaps/image.png b/demo/bitmaps/image.png index 4d47733b..4ca76e25 100644 Binary files a/demo/bitmaps/image.png and b/demo/bitmaps/image.png differ diff --git a/demo/bitmaps/image.tif b/demo/bitmaps/image.tif new file mode 100644 index 00000000..2d708e9d Binary files /dev/null and b/demo/bitmaps/image.tif differ