【问题标题】:How can I rotate an image (loaded by the PhotoImage class) on a canvas, without PIL or pillow?如何在没有 PIL 或枕头的情况下在画布上旋转图像(由 PhotoImage 类加载)?
【发布时间】:2017-09-15 18:38:51
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    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 Imaging Library)... 基本上有人已经完成了这项工作,将其优化为速度和内存消耗的最佳选择,并将其打包成方便的类和函数。但如果你不能或不想要 PIL,你绝对可以旋转 PhotoImage。您只需要自己编写方法。

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

    【讨论】:

      【解决方案2】:

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

      来自official Canvas documentation

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

      【讨论】:

      • 为什么?你会认为这将是一个非常基本的添加和常用的东西
      • @Feesih0ps:可能是因为这种方式已经 25 年了,并且没有引起太大的骚动。另外,不幸的是,在过去十年中实际从事 Canvas 实施工作的人数很可能非常接近 1,如果不是更少的话。
      • 我什至不应该使用 tkinter,老实说,我希望我的学校可以安装 pygame。有没有办法通过基本的python 3.5安装来解决这个问题?就像从 python 内部操纵 gimp 或绘画一样? (除了以 360 度不同的旋转保存图像并导入它们)
      • 确实不能旋转图像,但可以制作图像的旋转副本。我有一个视频游戏课,我用这种方式写了动画。这是一个以这种方式完成的动画的链接,我在一个非常相似的问题上发布了答案:stackoverflow.com/a/41254261/9710971
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多