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

本文介绍了一个使用wxPython和Matplotlib显示图像的例子。通过两个不同的方法:直接使用wxPython读取图像文件和利用Matplotlib加载图像数据,展示了如何在wxPython应用程序中呈现图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()


有图有真相

 

 

两种方法导入图都是正确的.

wxPython Matplotlib 的结合可以让你在 Python 中创建功能强大的图形用户界面 (GUI) 应用程序,并将数据可视化嵌入到 GUI 界面中。 **以下是关于 `wxPython` `Matplotlib` 结合使用的简要说明:** ### 什么是 wxPython? `wxPython` 是一种用于构建跨平台图形用户界面 (GUI) 的工具包。它允许开发者使用原生操作系统控件来设计应用程序,使得应用看起来更像是本地软件,而不是通用的 Web 或脚本风格的应用。 ### 什么是 Matplotlib? `Matplotlib` 是一个流行的绘图库,能够生成高质量的数据图表、曲线其他类型的二维图像。它可以绘制各种统计图表,如折线图、柱状图、饼图等。 --- ### 将 Matplotlib 集成到 wxPython 通过 `FigureCanvasWxAgg` 类(这是 `matplotlib.backends.backend_wxagg` 模块的一部分),我们可以轻松地把 Matplotlib 图表嵌入到 wxPython 开发的窗口组件里。这个过程主要包括以下几个步骤: 1. **创建主框架**: 使用 `wx.Frame` 构建基本布局; 2. **添加画布(Canvas)**: 在该帧上放置一个 Canvas 来显示Matplotlib 创建的内容; 3. **配置坐标轴(Axes)**: 初始化 Figure 对象并获取 Axes 实例以便设置标题、标签及其他属性; 4. **渲染图表(Plotting Data)**: 调用必要的函数完成数据点标注以及最终呈现结果. 例如下面是一个简单的例子展示如何在一个小窗口内展现正弦波形: ```python import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import axes3d from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas from matplotlib.figure import Figure import numpy as np import wx class MyFrame(wx.Frame): def __init__(self, parent=None, id=-1, title='wxMatplotlib'): super().__init__(parent=parent, id=id, title=title) self.panel = wx.Panel(self) # Create the figure and canvas for drawing. self.figure = Figure() self.axes = self.figure.add_subplot(111) self.canvas = FigureCanvas(self.panel, -1, self.figure) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.canvas, 1, flag=wx.ALL | wx.EXPAND, border=5) self.plot_data() self.panel.SetSizer(sizer) def plot_data(self): x = np.arange(-np.pi * 6, np.pi * 6, .01) y = np.sin(x) self.axes.clear() # 清空之前的绘制内容 self.axes.plot(x,y,'r') # 'r' 表示红色线条 self.canvas.draw() if __name__ == '__main__': app = wx.App(False) frame = MyFrame(title="Sin Wave Example") frame.Show(True) app.MainLoop() ``` 此段代码会启动一个新的窗口,在其中动态绘制出一条连续变化的正弦曲线。 --- ### 注意事项 - 当调整窗口大小时需要重新布置所有的元素以适应新的尺寸。 - 如果计划处理大量实时更新的数据,则应考虑性能优化策略比如仅刷新部分区域而非整个画面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值