使用Python PIL中的三次插值方法对图像进行放大处理

5

你好,我想要将一批尺寸为(a,b,3)的图片调整到更大的尺寸(c,d,3)(c>a, d>b),并使用三次插值。但是当我第一次成功地调整大小后,重新打开调整大小后的图片时,发现图片仍然是旧的尺寸... 在我的尝试中,每张图片和每个尺寸都出现了这个问题... 请问有谁能指出我错过了什么吗?非常感谢!

以下是我的代码:

from PIL import Image
im = Image.open("img0.jpg").convert("RGB")
im # the original size
<PIL.Image.Image image mode=RGB size=600x337 at 0x102D83450>
im.resize((800,400),Image.BICUBIC)
<PIL.Image.Image image mode=RGB size=800x400 at 0x102D834D0> # thought I was doing it right
im.save("resized.jpg")
im=Image.open("resized.jpg").convert("RGB")
im
<PIL.Image.Image image mode=RGB size=600x337 at 0x102D83490> # and the actual size seems even smaller than before!
1个回答

9

图像的缩放不是原地进行的。会返回一个新的、已调整大小的图像,因此您必须保存它。

new_img = im.resize((800,400),Image.BICUBIC)
new_img.save("resized.jpg")

或者

im.resize((800,400),Image.BICUBIC).save("resized.jpg")

无论一个方法或函数是否“就地”进行更改(这意味着没有返回值可供使用,返回值为None),还是返回一个必须使用的值,取决于方法或函数的创建者。您可以通过试错来弄清楚这一点,但更好的方法是查看文档。例如,对于PIL/Pillow的resize()方法,请查看https://pillow.readthedocs.io/en/3.4.x/reference/Image.html#PIL.Image.Image.resize,您将看到该函数:

返回此图像的调整大小副本。

这告诉您必须对返回值做些什么,以保留方法的效果。

此外,如果您转到http://effbot.org/imagingbook/image.htm并跳至resize,您会看到它说:

resize #

im.resize(size) ⇒ image

im.resize(size, filter) ⇒ image

指向右边的“箭头”是表示该方法返回一个值的符号。在这种情况下,它返回一个图像。


谢谢你,非常感谢!翻译得很快,以至于我要等9分钟才能接受它... 我一定会在9分钟内完成。 - shenglih
1
太好了!你会有时间进行修改并测试它是否正常工作。 :) - GaryMBloom
啊,我当时立刻测试了一下,它确实可以工作:D - shenglih
您介意解释一下吗?这是特定于Python语言还是包,还是更普遍的任何OOP /函数式语言?我什么时候可以假设类似的操作会在原地发生,什么时候不能?非常感谢! - shenglih
我在上面的答案中添加了更多的解释。愉快编码! - GaryMBloom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接