matplotlib实现同一页面显示两张图片且单独缩放和拖动各自的图片
程序员文章站
2022-03-26 20:05:28
需求如下: 1、在一个页面中显示两张图片 2、进入页面可以使用鼠标拖动各自的图片,相互不受影响 3、进入页面后可以使用鼠标滚轮放大或缩小图片,相互不受影响,即鼠标移动到图片A上,可对图片A进行放大或缩小,图片B不受影响,反之亦然 4、拖动需求同3 实现代码: 参考网址: 1.https://matp ......
需求如下:
- 1、在一个页面中显示两张图片
- 2、进入页面可以使用鼠标拖动各自的图片,相互不受影响
- 3、进入页面后可以使用鼠标滚轮放大或缩小图片,相互不受影响,即鼠标移动到图片a上,可对图片a进行放大或缩小,图片b不受影响,反之亦然
- 4、拖动需求同3
实现代码:
import matplotlib.pyplot as plt from pil import image import numpy as np class scale: def __init__(self,fig,base_scale=1.5): self.fig=fig self.base_scale=base_scale self.x0 = none self.y0 = none self.x1 = none self.y1 = none self.xpress = none self.ypress = none self.cur_xlim = none self.cur_ylim = none self.press = none self.fig.canvas.mpl_connect('scroll_event', self.enter_axes) self.fig.canvas.mpl_connect("button_press_event", self.enter_axes) self.fig.canvas.mpl_connect('button_press_event',self.onpress) self.fig.canvas.mpl_connect('button_release_event',self.onrelease) self.fig.canvas.mpl_connect('motion_notify_event',self.onmotion) def enter_axes(self,event): # print(f"enter axes {event.inaxes}") axtemp = event.inaxes self.cur_xlim=axtemp.get_xlim() self.cur_ylim=axtemp.get_ylim() # print(f"x {self.cur_xlim} y {self.cur_ylim}") xdata=event.xdata ydata=event.ydata if event.button == "up": scale_factor=1/self.base_scale elif event.button == "down": scale_factor=self.base_scale else: scale_factor=1 new_width = (self.cur_xlim[1] - self.cur_xlim[0]) * scale_factor new_height = (self.cur_ylim[1] - self.cur_ylim[0]) * scale_factor relx = (self.cur_xlim[1] - xdata) / (self.cur_xlim[1] - self.cur_xlim[0]) rely = (self.cur_ylim[1] - ydata) / (self.cur_ylim[1] - self.cur_ylim[0]) axtemp.set_xlim([xdata - new_width * (1 - relx), xdata + new_width * (relx)]) axtemp.set_ylim([ydata - new_height * (1 - rely), ydata + new_height * (rely)]) self.fig.canvas.draw_idle() def onpress(self,event): axtemp = event.inaxes if event.inaxes != axtemp: return self.cur_xlim = axtemp.get_xlim() self.cur_ylim = axtemp.get_ylim() self.press = self.x0, self.y0, event.xdata, event.ydata self.x0, self.y0, self.xpress, self.ypress = self.press def onmotion(self,event): if self.press is none: return if event.inaxes != event.inaxes: return dx = event.xdata - self.xpress dy = event.ydata - self.ypress self.cur_xlim -= dx self.cur_ylim -= dy event.inaxes.set_xlim(self.cur_xlim) event.inaxes.set_ylim(self.cur_ylim) def onrelease(self,event): self.press = none event.inaxes.figure.canvas.draw_idle() class viewimg: def __init__(self,imgpath): self.imgpath=imgpath def viewimage(self): try: img1=image.open(self.imgpath[0]) img2=image.open(self.imgpath[1]) imglist=[] for item in [img1,img2]: if item == img1: scale=2000/item.size[0] print(f"img1:{item},{scale}") elif item == img2: scale=3000/item.size[0] print(f"img2:{item},{scale}") width=int(item.size[0]*scale) height=int(item.size[1]*scale) print(f"(width,height):{(width,height)}") item=item.resize((width,height),image.antialias) item=np.array(item) imglist.append(item) if len(imglist)==2: img1,img2=imglist else: print(f"读取图片数量出错,{len(imglist)}") return except exception as ex: print(f"view image error\n{ex}") return else: # 设置窗口最大化前参数 plt.switch_backend("qt5agg") fig=plt.figure("染色体图和细胞图") # 添加1行2列格子并添加第一个子格 ax1=fig.add_subplot(1,2,1) # 仅显示坐标轴,但不显示刻度线 plt.xticks([]) plt.yticks([]) # 显示图片 plt.imshow(img1, aspect="auto") plt.axis('on') # 添加1行2列格子并添加第二个子格 ax2=fig.add_subplot(1, 2, 2) # 添加自动布局 plt.tight_layout() plt.xticks([]) plt.yticks([]) plt.imshow(img2, aspect="auto") plt.axis('on') # 调整四周和子图之间的间距 plt.subplots_adjust(left=0.005,right=0.995,bottom=0.005,top=0.995,wspace=0.010,hspace=0.1) # 设置最大化 plt.get_current_fig_manager().window.showmaximized() ax1.set_title("dna") ax2.set_title("cell") scale=scale(fig) plt.show() if __name__ == '__main__': imgpath=[r"c:\users\surpass\documents\pycharmprojects\a.jpg",r"c:\users\surpass\documents\pycharmprojects\b.jpg" ] viewimg=viewimg(imgpath) viewimg.viewimage()
参考网址:
- 1.
- 2.
上一篇: GB码和BIG5码的互换技术
下一篇: 记录一个开头带有的特征数据的解码