您的位置:首页 > 编程语言 > Python开发

wxpython和matplotlib显示图像的一个例子

2013-01-18 22:40 567 查看
wxpython和matplotlib显示图像的一个例子.

#-*- coding:utf-8 -*-
########################################
#Author: wxuping
#Date: 2013-01-18
#Function: Show Image using wxpython,as well as matplotlib
#######################################
import numpy
import wx
from matplotlib.pyplot import imread

###########################################################################
## Class wxImagePanel
###########################################################################

class wxImagePanel ( wx.Panel ):
def __init__( self, parent,wximage,size = wx.Size( 500,300 ) ):
wx.Panel.__init__ ( self, parent, id = wx.ID_ANY, size = size )
self.bSizer = wx.FlexGridSizer(rows=1, cols=1, vgap=10, hgap=10 )
Width,Height=self.GetClientSize()
self.wxbitmap=wx.BitmapFromImage(wximage.Rescale(Width,Height))
self.m_bitmap1 = wx.StaticBitmap( self, wx.ID_ANY,self.wxbitmap, wx.DefaultPosition, wx.DefaultSize, 0 )
self.bSizer.Add( self.m_bitmap1 )
self.SetSizerAndFit( self.bSizer )
self.Layout()

def SetwxImageData(numpyarray):
"""
#本程序将numpyarray的数据加载到wxImage中
#numpyarray一般从文件中读取
#>>from matplotlib.pyplot import imread
#>>numpyarray=imread(filename)
#numpyarray必须是2维灰度图像或3维数组(R,G,B)
#本程序的作用是可以将修改后的numpyarray加载到image中
"""
import array
nasize=len(numpyarray.shape)#测试数组的位数
if nasize==2:
Height,Width=numpyarray.shape
wximage=wx.EmptyImage(Width,Height)
Data=numpy.empty([Height,Width,3],dtype='byte')
Data[:,:,0]=numpyarray
Data[:,:,1]=numpyarray
Data[:,:,2]=numpyarray
wximage.SetData(numpy.flipud(Data).tostring())
elif nasize==3:
Height,Width,dim=numpyarray.shape
wximage=wx.EmptyImage(Width,Height)
if dim==3:#保存的是(R,G,B)
#注意下面的代码,一定要将numpyarray上下反转一下
wximage.SetData(numpy.flipud(numpyarray).tostring())
elif dim==4:#某些格式,较少见
Data=numpy.empty([Height,Width,3],dtype='byte')
Data[:,:,:]=numpyarray[:,:,0:3]
wximage.SetData(numpy.flipud(Data).tostring())
elif dim==1:#其实仍然是灰度图像
Data=numpy.empty([Height,Width,3],dtype='byte')
Data[:,:,0]=numpyarray[:,:,0]
Data[:,:,1]=numpyarray[:,:,0]
Data[:,:,2]=numpyarray[:,:,0]
wximage.SetData(numpy.flipud(Data).tostring())
return wximage

class TestFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, size=(800,600))

fgs = wx.GridSizer(cols=2, hgap=10, vgap=10)
filename ="image.bmp"
#1 直接读取文件并显示
image1=wx.Image(filename,wx.BITMAP_TYPE_ANY)
Width=image1.GetWidth()
Height=image1.GetHeight()
self.SetTitle("width:"+str(Width)+"   Height"+str(Height))
self.wip1=wxImagePanel(self,image1,size=(600,500))

#2 使用matplotlib读取图像文件并显示
numpyarray=imread(filename)
#注意numpyarray的第一维表示高度,第二维表示宽度
image2=SetwxImageData(numpyarray)
self.wip2=wxImagePanel(self,image2)

# and put them into the sizer
fgs.Add(self.wip1)
fgs.Add(self.wip2)

self.SetSizerAndFit(fgs)
self.Center()

if __name__ == '__main__':
app = wx.PySimpleApp()
frm = TestFrame()
frm.Show()
app.MainLoop()


有图有真相



两种方法导入图都是正确的.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: