旋转后Python PIL保存图像

Posted

技术标签:

【中文标题】旋转后Python PIL保存图像【英文标题】:Python PIL save image after rotating 【发布时间】:2012-06-03 17:46:16 【问题描述】:

我在旋转图像后保存图像时遇到问题。我的意思是,当我在旋转图像后调用函数 save 时,什么也没有发生。旧图像保持不变,我的另存为功能也出现了同样的问题。我想问题出在我的旋转功能上:

 def right90 (root, image, panel, filemenu):
        image = image.transpose(Image.ROTATE_90)
        image1 = ImageTk.PhotoImage(image)
        root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0))
        panel.configure(image = image1)
        panel.pack(side='top', fill='both', expand='yes')
        panel.image = image1

下面是我使用的保存功能。我猜它似乎没有任何问题。

def save(image, filename):
    image.save(filename) 

但是,我似乎无法弄清楚问题出在哪里。我真的希望有人能帮我找到它。谢谢。

已编辑

下面是我声明全局变量的函数。这用于打开图像文件并使用文件的信息为变量赋值。

def display(root):
    global filename
    filename = askopenfilename(filetypes=[("All Files","*"),("All Picture Files","*bmp; *.png; *.jpg; *.jpeg; *.jpe; *.tif; *.tiff")])

    global image
    global panel
    try:
        image = Image.open(filename)
        image1 = ImageTk.PhotoImage(file=filename)
        root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0))
        panel.configure(image = image1)
        panel.pack(side='top', fill='both', expand='yes')
        panel.image = image1

    except NameError:        
        image = Image.open(filename)
        image1 = ImageTk.PhotoImage(file=filename)
        root.geometry("%dx%d+%d+%d" % (image.size[0], image.size[1], 0, 0))
        panel= Label(root, image = image1)
        panel.pack(side='top', fill='both', expand='yes')
        panel.image = image1

以下是我编写的调用旋转函数的代码。以防万一有人需要。

rotatemenu.choices.add_command(label="rotate right 90°", command = lambda:img.right90(root, image, panel, filemenu))

【问题讨论】:

会不会是image1 = ImageTk.PhotoImage(image) 从函数调用中获取image 而不是它上面一行中描述的那个?换个名字试试? 【参考方案1】:

我怀疑当您调用save 时,您传递了一个引用原始图像的变量。只是猜测,因为right90 没有return image

【讨论】:

其实我不确定你的建议,因为我的image 是一个全局变量。那么当它的值改变时(通过分配给 image.transpose)那么它会全局改变吗? 如果你想在一个函数中修改一个全局变量,你还必须在该函数中声明它global。 (但通常最好完全避免这种方法) image 是 main 方法中的全局变量,我将函数的名称称为菜单命令,但它在该命令中用作参数。而且 Python 不允许将参数声明为全局变量。我猜这听起来有点复杂。 但确实当我为参数分配新值时,全局变量的值并没有改变。我不知道如何解决它。 @pinkcupcake 您需要重新考虑应用程序的结构。一种可能的方法是创建一个类:所有这些函数都成为类的方法,全局变量成为实例属性。【参考方案2】:

是否必须同时拥有变量名imageimage1?我认为这可能是问题的根源,我同意@janne Karila 的观点,您很可能不会返回更改后的图像。

你能在你的right90 函数中做一个image.show()/image1.show() 看看它显示了什么吗?

【讨论】:

当我点击旋转时(我在这里使用 GUI),图像被旋转但是当我点击保存时,没有任何反应。我使用 image1,所以我可以将它添加到标签(需要 PhotoImage) 你能贴出调用这两个函数的代码吗?我不确定使用全局变量是否有益,所以这有点令人担忧。 我在我的问题中添加了更多细节。我也很困惑,因为我还有一些其他的函数用来改变图像的 RGB 值,而且我以与旋转相同的方式显示图像,但是保存功能工作正常,所以我仍然认为问题所在在于旋转功能。 @pinkcupcake 不太确定建议什么(不熟悉您正在使用的 GUI 元素),除了有选择地注释掉部分,或者替换 right90() 中的其他函数只是为了测试图像是否发生变化和变化坚持。最后,PIL rotate() 功能是否受限于您的需求? 当我在一个简单的程序中测试它时,该函数运行良好,我认为它对我来说已经足够了。感谢您的讨论!

以上是关于旋转后Python PIL保存图像的主要内容,如果未能解决你的问题,请参考以下文章

Python使用PIL基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中

使用 Python 旋转具有 EXIF 中指定方向的图像,而不使用 PIL,包括缩略图

使用PIL在python中旋转并将expand参数设置为true时指定图像填充颜色

Pillow

Pillow

通过套接字发送pil图像而不保存python