如何在没有PIL或枕头的情况下在画布上旋转图像(由PhotoImage类加载)?

时间:2017-09-15 18:38:51

标签: python-3.x tkinter tkinter-canvas

我想旋转图像以跟随我的鼠标,我的学校计算机没有PIL。

2 个答案:

答案 0 :(得分:0)

你不能。画布不支持旋转图像的能力,内置的PhotoImage类也不支持。

来自official Canvas documentation

  

可以使用下面描述的窗口小部件命令移动或缩放单个项目,但它们可能不会旋转。

答案 1 :(得分:0)

Bryan的答案在技术上是正确的,因为PhotoImage类不包含旋转方法,tk.Canvas也不包含。但这并不意味着我们无法解决该问题。

def copy_img(img):
    newimg = tk.PhotoImage(width=img.width(), height=img.height())
    for x in range(img.width()):
        for y in range(img.height()):
            rgb = '#%02x%02x%02x' % img.get(x, y)
            newimg.put(rgb, (x, y))
    return newimg

上面的函数创建一个空白的PhotoImage对象,然后使用传递到其中的图像中的数据填充新PhotoImage的每个像素,从而逐像素地完美复制...这是无用的。

但是!假设您想要一张颠倒的图像副本。将函数的最后一行更改为:

newimg.put(rgb, (x, img.height()-1 - y))

瞧!该函数仍然从上至下读取,但从下至上进行写入,从而在y轴上镜像了图像。希望它向右旋转90度吗?:

newimg.put(rgb, (img.height() - y, x))

用y代替x使其写行的列,从而有效地旋转它。

您对图像处理PhotoImage对象的深度有多深取决于您。如果您可以访问PIL(Python影像库)...某人已经基本完成了这项工作,请对其进行优化以使其最适合速度和内存消耗,然后将其打包为您方便的类和函数。但是,如果您不希望使用PIL,则绝对可以旋转PhotoImage。您只需要自己编写方法即可。

感谢acw1668的帖子,在这里使我了解了PhotoImage操作的基础知识: https://stackoverflow.com/a/41254261/9710971