Tkinter的canvas小部件具有以下内置功能:
使用canvas.scan_mark
和canvas.scan_dragto
移动/平移画布(例如单击+拖动),请参见this question
使用canvas.scale
缩放画布上的矢量元素,但遗憾的是,对于画布上的位图图像,这是doesn't work
幸运的是,this method允许缩放图像(通过手动重绘图像的缩放部分)。但是:
由于我们正在重新绘制画布的特定部分,移动/平移功能将不再工作。。。
我们绝对需要渲染超过当前显示的区域,以允许移动/平移。假设画布上有1000x1000个位图,我们想放大50倍。。。如何避免内存中有50.000 x 50.000像素的位图?(内存中的250万像素太大)。我们可以考虑只渲染视口,或者比当前视口稍微多一些以允许平移,但是一旦平移导致渲染区域的边缘,该怎么办?
如何在Tkinter画布上使用可用于图像的移动/平移+缩放功能?
在这种情况下,您可以考虑使用地图平铺。平铺可以特定于缩放级别。根据“平移”和“缩放”级别选择平铺后,可以使用
Canvas.create_image
将它们放置在画布上。假设您有一个带有坐标和图像的tile类,那么您可以根据pan、zoom和frame size来选择可见的tile。
John sample和Elias Ioup在Tile-Based Geospatial Information Systems的平铺映射客户机一章中提供了完整的示例。
高级缩放示例。比如谷歌地图。
视频示例(longer video here):
它只缩放一个平铺,而不是整个图像。因此,缩放后的平铺占据了恒定的内存,而不是为大的缩放填充一个大尺寸的图像。对于简化的缩放示例look here。
在Windows7 64位和Python3.6.2上测试。
不要忘记在脚本的末尾放置指向图像的路径。
编辑:
我创造了更先进的变焦。有“图像金字塔”可以平滑缩放大图像,甚至可以打开和缩放高达几十亿字节的巨大TIFF文件。
版本3.0在Windows7 64位和Python3.7上测试。
p.S.这里是GitHub应用程序,它使用了manual image annotation with polygons的高级缩放功能。
相关问题 更多 >
编程相关推荐