Python 3.x 如何在不使用PIL的情况下在画布上旋转图像?

Python 3.x 如何在不使用PIL的情况下在画布上旋转图像?,python-3.x,tkinter,tkinter-canvas,Python 3.x,Tkinter,Tkinter Canvas,有没有简单的方法可以在tkinter画布上旋转导入的图像?我宁愿不使用PIL模块,但我找不到任何可行的替代方案。(如果有帮助的话,我想在十字路口转弯时旋转一些汽车图像。)下面是一个简单但不高效的方法,可以将照片旋转90度(右)、180度和270度(左): 非常感谢@acw1668在本页上的回答,这帮助我开发了这个更高效的解决方案 结果表明,PhotoImage.put()方法接受字符串数据,并将任何模式作为字符串写入循环,以填充图像中的给定区域。因此,我们不必一个接一个地读取每个像素,然后一个接

有没有简单的方法可以在tkinter画布上旋转导入的图像?我宁愿不使用PIL模块,但我找不到任何可行的替代方案。(如果有帮助的话,我想在十字路口转弯时旋转一些汽车图像。)

下面是一个简单但不高效的方法,可以将照片旋转90度(右)、180度和270度(左):


非常感谢@acw1668在本页上的回答,这帮助我开发了这个更高效的解决方案

结果表明,PhotoImage.put()方法接受字符串数据,并将任何模式作为字符串写入循环,以填充图像中的给定区域。因此,我们不必一个接一个地读取每个像素,然后一个接一个地写入每个像素,我们可以读取每个像素,然后只写入一次

下面的函数允许您旋转和镜像任何PhotoImage对象,并且这样做的时间比逐像素读写方法的时间要短。镜像只需从后向前读取每一行或每一列即可完成。旋转将每行写入一列,从而有效地将图像旋转90度

import tkinter as tk

def putToImage(brush, canvas, bbox, mirror_x=False, mirror_y=False, rotate=False):
    value1 = brush.height() if rotate else brush.width()
    value2 = brush.width() if rotate else brush.height()
    start1, end1, increment1 = (value1 - 1, -1, -1) if mirror_x else (0, value1, 1)
    start2, end2, increment2 = (value2 - 1, -1, -1) if mirror_y else (0, value2, 1)

    data = ""
    for col in range(start2, end2, increment2):
        data = data + "{"
        for row in range(start1, end1, increment1):
            data = data + "#%02x%02x%02x " % brush.get(col if rotate else row, row if rotate else col)
        data = data + "} "
    canvas.put(data, to=bbox)
下面是一个简单的用法示例:

window = tk.Tk()
lbl1 = tk.Label(window)
lbl2 = tk.Label(window)

my_img = tk.PhotoImage(file="my_image.png")
rotated_img = tk.PhotoImage(width=my_img.height(), height=my_img.width())
putToImage(my_img, rotated_img, (0, 0, rotated_img.width(), rotated_img.height()), rotate=True)

lbl1.configure(image=my_img)
lbl1.pack()
lbl2.configure(image=rotated_img)
lbl2.pack()

window.mainloop()  

tkinter无法旋转图像。你可以像这样用旋转的汽车来创建图像,然后你可以不用PIL来使用它。
window = tk.Tk()
lbl1 = tk.Label(window)
lbl2 = tk.Label(window)

my_img = tk.PhotoImage(file="my_image.png")
rotated_img = tk.PhotoImage(width=my_img.height(), height=my_img.width())
putToImage(my_img, rotated_img, (0, 0, rotated_img.width(), rotated_img.height()), rotate=True)

lbl1.configure(image=my_img)
lbl1.pack()
lbl2.configure(image=rotated_img)
lbl2.pack()

window.mainloop()