Tkinter 的画布小部件具有以下内置功能:
使用
canvas.scan_mark
和canvas.scan_dragto
移动/平移画布(例如通过单击 + 拖动),请参阅 此问题使用
canvas.scale
缩放画布上的矢量元素,但遗憾的是,这 不适 用于画布上的位图图像
幸运的是, 此方法 允许缩放图像(通过手动重绘图像的缩放部分)。但:
当我们重绘画布的特定部分时,移动/平移功能将不再起作用……
我们绝对需要渲染比当前显示区域更多的区域,以允许移动/平移。假设我们在画布上有 1000x1000 的位图,我们想放大 50 倍…如何避免内存中有 50.000 x 50.000 像素的位图? (RAM 中的 2.5 gigapixels 太大了)。我们可以考虑只渲染视口,或者比当前视口多一点以允许平移,但是一旦平移导致渲染区域的边缘怎么办?
如何在适用于图像的 Tkinter 画布上具有移动/平移 + 缩放功能?
原文由 Basj 发布,翻译遵循 CC BY-SA 4.0 许可协议
高级缩放示例。就像在谷歌地图中一样。
示例视频( 这里有更长的视频):
它只缩放一个图块,而不是整个图像。因此,缩放后的图块会占用恒定的内存,而不会为大缩放而塞入巨大的调整大小的图像。对于简化的缩放示例, 请看这里。
在 Windows 7 64 位和 Python 3.6.2 上测试。
不要忘记在脚本末尾放置图像的路径。
编辑:
我创造了更高级的缩放。有“图像金字塔”可以平滑缩放大图像,甚至能够打开和缩放高达数 GB 的巨大 TIFF 文件。
3.0 版在 Windows 7 64 位和 Python 3.7 上进行了测试。
PS Here 是 GitHub 应用程序,它使用高级缩放对 多边形进行手动图像注释。