旋转后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】:
是否必须同时拥有变量名image
和image1
?我认为这可能是问题的根源,我同意@janne Karila 的观点,您很可能不会返回更改后的图像。
你能在你的right90
函数中做一个image.show()
/image1.show()
看看它显示了什么吗?
【讨论】:
当我点击旋转时(我在这里使用 GUI),图像被旋转但是当我点击保存时,没有任何反应。我使用 image1,所以我可以将它添加到标签(需要 PhotoImage) 你能贴出调用这两个函数的代码吗?我不确定使用全局变量是否有益,所以这有点令人担忧。 我在我的问题中添加了更多细节。我也很困惑,因为我还有一些其他的函数用来改变图像的 RGB 值,而且我以与旋转相同的方式显示图像,但是保存功能工作正常,所以我仍然认为问题所在在于旋转功能。 @pinkcupcake 不太确定建议什么(不熟悉您正在使用的 GUI 元素),除了有选择地注释掉部分,或者替换right90()
中的其他函数只是为了测试图像是否发生变化和变化坚持。最后,PIL rotate()
功能是否受限于您的需求?
当我在一个简单的程序中测试它时,该函数运行良好,我认为它对我来说已经足够了。感谢您的讨论!以上是关于旋转后Python PIL保存图像的主要内容,如果未能解决你的问题,请参考以下文章
Python使用PIL基于坐标范围批量剪裁(图像)并将剪裁后的图像保存到指定的新文件夹中
使用 Python 旋转具有 EXIF 中指定方向的图像,而不使用 PIL,包括缩略图