PythonTip >> 博文 >> chinaunix

wxpython下图片局部显示的方法

zihua 2014-01-13 18:01:41 点击: 969 | 收藏


    我想要显示图片其中的一部分,其他不想显示的画面不显示出来!摸索了好久,发现了以下两种方法:
    1、画个矩形(或其他图形也行)把你不想显示出来的画面遮住!如何遮呢?就是先加载图片,接着再在想要遮住的地方画图。
    2、使用设备上下文的SetClippingRegion(w,y,width,height)方法,下面是摘自《WxPython In Action》中的一段(注意理解“部分重绘”这个概念:个人理解为局部刷新):
    你通常会想只将绘制更新到设备上下文的特定区域。这通常是在考虑到性能的原因时,特别是如果你知道一个大的或复杂的图形只需要部分重绘时。这种重绘被称为“clipping”,并且相应的设置方法是
SetClippingRegion(x, y, width, height)。
    其中,参数x,y是左上角的坐标,width和height是矩形区域的尺寸。一旦设置了,绘制处理将只发生在指定的区域。
    要解除这个设置,可以使用DestroyClippingRegion()方法。要读取当前的clip区域,使用方法GetClippingBox(),它返回一个(x, y, width, height)元组。
下面是两种方法如何实现的代码:
程序一:遮盖的方法:
  1 import wx
  2 class RectangleWindow(wx.Window):
  3     def __init__(self,event,image):
  4         wx.Window.__init__(self,event)
  5         self.photo = image.ConvertToBitmap()
  6         self.Bind(wx.EVT_PAINT,self.OnPaint)
  7
  8     def OnPaint(self,event):
  9         DC = wx.PaintDC(self)
 10         brush = wx.Brush("white")
 11         DC.SetBackground(brush)
 12         DC.Clear()
 13
 14         pen = wx.Pen("white")
 15         #!!OR like this way:pen = wx.Pen("reg",1,sytle = wx.TRANSPARENT)#
 16         #pen = wx.Pen("reg",1,wx.TRANSPARENT)
 17         DC.SetPen(pen)
 18
 19         DC.DrawBitmap(self.photo,10,10,True)
 20         DC.DrawBitmap(self.photo,200,10,True)
 21         DC.DrawRectangle(240,40,60,50)
 22
 23 class RectangleFrame(wx.Frame):
 24     def __init__(self):
 25         wx.Frame.__init__(self,None,title = "Draw Rectangle Frame",size = (400,300),)
 26         img = wx.Image("E6.jpg")
 27         RectangleWindow(self,img)
 28
 29 if __name__ == "__main__":
 30     app = wx.App()
 31     RectangleFrame = RectangleFrame()
 32     RectangleFrame.Show()
 33     app.MainLoop()

运行效果如下图:


程序二:选择性显示的方法:
 1 import wx
  2 class ClipWindow(wx.Window):
  3     def __init__(self,ent,image):
  4         wx.Window.__init__(self,ent)
  5         self.photo = image.ConvertToBitmap()
  6
  7         self.Bind(wx.EVT_PAINT,self.Paint)###
  8     def Paint(self,event):###
  9         DC = wx.PaintDC(self)
 10         brush = wx.Brush("white")
 11         DC.SetBackground(brush)
 12         DC.Clear()
 13
 14         DC.DrawBitmap(self.photo,10,10,True)
 15         DC.SetClippingRegion(370,95,50,40)
 16         DC.DrawBitmap(self.photo,300,10,True)
 17
 18
 19 class ClipFrame(wx.Frame):
 20     def __init__(self):
 21         wx.Frame.__init__(self,None,title = "SetClippingRegion",pos = (0,    0),size = (600,400))
 22         #panel = wx.Panel()
 23         img = wx.Image("qq1.png")
 24         ClipWindow(self,img)
 25
 26 if __name__ == "__main__":
 27     app = wx.App()
 28     ClipFrame = ClipFrame()
 29     ClipFrame.Show()
 30     app.MainLoop()
效果如下图:

小结:
第一种方法比较麻烦,如果你想显示的的部分比较少的话,就需要大面积的画图去遮住你不想显示的图像,而且还要定位到哪里要被遮住,
再一个就是画完图之后,自己画的图会存在边框线条,看起来很不自然,我们需要对其进行边框处理,方法有二(程序一中的第14--17行):
    1、把wx.Pen的颜色属性设置为白色(wx.Pen = (colour = "white"))
    2、把wx.Pen的类型属性设置为透明:wx.Pen = (colour = "red",width = 1,style = wx.TRANSPARENT),这里把颜色设置为红色是为了方便观察,但也不能省略,省略不写的话就会报错。
第二种方法就比较简单,且针对性比较强,想要哪里显示就显示哪里,无需其他的后续处理,但有一个缺陷就是显示的局部形状只能是矩形,而不能其他的形状。
这两种方法的共同缺点就是都只能是在一个矩形的范围内进行处理操作。
原文链接:http://blog.chinaunix.net/uid-29127275-id-3940825.html

作者:zihua | 分类: chinaunix | 标签: python | 阅读: 969 | 发布于: 2014-01-13 18时 |