Python PIL调整大小是否保持宽高比?

fre*_*rix 9 python resize python-imaging-library

无论如何,PIL会调整到我给它的确切尺寸吗?或者,如果我给它类似的Image.ANTIALIAS论点,它会尝试保持纵横比吗?

Mak*_*nko 28

是的,它将使用缩略图方法保持宽高比:

image = Image.open(source_path)
image.thumbnail(size, Image.ANTIALIAS)
image.save(dest_path, "JPEG")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,缩略图方法在其他方面并不等效 - 它不会将图像放大到比原来更大,并且它作用于图像对象并且不返回任何内容。 (5认同)
  • ANTIALIAS 方法名称更新:从 2.7.0 开始,所有调整大小的方法都是 ANTIALIAS,特定 ANTIALIAS 过滤器的真实(新)名称是 LANCZOS。(目前为了向后兼容而保留 antialias) https://pillow.readthedocs.io/en/3.0.x/releasenotes/2.7.0.html#antialias-renamed-to-lanczos (3认同)
  • 另请注意,此函数会就地修改“Image”对象。如果您还需要使用全分辨率图像,请根据[文档](https://pillow.readthedocs.io/en/stable/reference/Image)将此方法应用于原始图像的“copy()” .html#Image.thumbnail)。 (3认同)

fab*_*hel 22

最近的 Pillow 版本(自 8.3 起)具有以下方法来调整图像大小以适合给定的框并保持纵横比。

image = ImageOps.contain(image, (2048,2048))
Run Code Online (Sandbox Code Playgroud)

  • 根据意图,“ImageOps.fit(image, size)”也可能有所帮助。 (6认同)

Kug*_*gel 11

如何使用PIL调整图像大小并保持其纵横比?

来自PIL的Image.resize将完全按照说明完成.没有幕后宽高比的东西.


Lah*_*tne 9

不,不是的。但您可以执行以下操作:

im = PIL.Image.open("email.jpg"))
width, height = im.size
im = im.resize((width//2, height//2))
Run Code Online (Sandbox Code Playgroud)

这里高度和宽度除以相同的数字,保持相同的纵横比。

  • 您需要将 IM 分配回来。im.resize 不会修改原始图像。`im = im.resize((宽度//2, 高度//2))` (3认同)

Shr*_*hak 8

好的,所以这需要几行代码才能得到你想要的。

首先找到比率,然后确定所需图像的尺寸(高度或宽度)。就我而言,我希望高度为 100px,并相应调整宽度,最后使用该比率来找到新的高度或新的宽度。

所以首先找到尺寸:

width, height = logo_img.size
ratio = width / height
      
Run Code Online (Sandbox Code Playgroud)

然后,修复其中一个维度:

new_height = 100
Run Code Online (Sandbox Code Playgroud)

然后找到该高度的新宽度:

new_width = int(ratio * new_height)
            
logo_img = logo_img.resize((new_width, new_height))
Run Code Online (Sandbox Code Playgroud)


小智 6

是的。此处需要thumbnail() 方法...本文或有关该主题的其他帖子中未提及的一件事是“大小”必须是列表或元组。因此,要将最大尺寸调整为 500 像素,您可以调用: image.thumbnail((500,500), Image.ANTIALIAS)

另请参阅有关该主题的帖子: 如何使用 PIL 调整图像大小并保持其纵横比?


小智 6

这取决于您的需求,如果您愿意,您可以设置固定的高度和宽度,或者如果您愿意,您可以根据纵横比调整其大小。

对于纵横比调整大小,您可以尝试使用以下代码:

要使新图像的宽度和高度是原始图像的一半:

from PIL import Image
im = Image.open("image.jpg")
resized_im = im.resize((round(im.size[0]*0.5), round(im.size[1]*0.5)))
        
#Save the cropped image
resized_im.save('resizedimage.jpg')
Run Code Online (Sandbox Code Playgroud)

要以固定宽度和比例动态高度调整大小:

from PIL import Image
new_width = 300
im = Image.open("img/7.jpeg")
concat = int(new_width/float(im.size[0]))
size = int((float(im.size[1])*float(concat)))
resized_im = im.resize((new_width,size), Image.ANTIALIAS)
#Save the cropped image
resized_im.save('resizedimage.jpg')
Run Code Online (Sandbox Code Playgroud)


tal*_*osh 5

Pillow 的最新版本在PIL.ImageOps.

\n

根据您想要实现的目标,您可能正在寻找以下之一:

\n
    \n
  • ImageOps.fit(image, size [, \xe2\x80\xa6]) (docs) \xe2\x80\x93 调整图像大小,保持其纵横比,并将其裁剪以适合给定大小

    \n
  • \n
  • ImageOps.contain(image, size [, \xe2\x80\xa6]) (docs) \xe2\x80\x93 调整图像大小,保持其纵横比,使其适合给定大小

    \n
  • \n
\n