簡體   English   中英

Python PIL 調整大小是否保持縱橫比?

[英]Does Python PIL resize maintain the aspect ratio?

無論如何,PIL 是否會調整到我給它的確切尺寸? 或者如果我給它類似Image.ANTIALIAS參數,它會嘗試保持縱橫比嗎?

是的,它將使用縮略圖方法保持縱橫比:

image = Image.open(source_path)
image.thumbnail(size, Image.ANTIALIAS)
image.save(dest_path, "JPEG")

如何使用 PIL 調整圖像大小並保持其縱橫比?

來自 PIL 的 Image.resize 將完全按照說明進行。 沒有幕后長寬比的東西。

最近的 Pillow 版本(自 8.3 起)具有以下方法來調整圖像大小以適應給定的框並保持縱橫比。

image = ImageOps.contain(image, (2048,2048))

是的。 thumbnail() 方法是這里需要的......在這個或關於該主題的其他帖子中沒有提到的一件事是“大小”必須是一個列表或元組。 因此,要將最大尺寸調整為 500 像素,您可以調用:image.thumbnail((500,500), Image.ANTIALIAS)

另請參閱有關該主題的帖子: 如何使用 PIL 調整圖像大小並保持其縱橫比?

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

im = PIL.Image.open("email.jpg"))
width, height = im.size
im = im.resize((width//2, height//2))

這里高度和寬度除以相同的數字,保持相同的縱橫比。

好的,所以這需要幾行代碼來獲得你想要的。

首先找到比率,然后確定所需圖像的尺寸(高度或寬度)。 在我的例子中,我希望高度為 100px 並讓寬度相應地調整,最后使用該比率來找到新的高度或新的寬度。

所以首先找到尺寸:

width, height = logo_img.size
ratio = width / height
      

然后,修復其中一個維度:

new_height = 100

然后找到該高度的新寬度:

new_width = int(ratio * new_height)
            
logo_img = logo_img.resize((new_width, new_height))

這取決於您的需求,如果您願意,您可以設置固定的高度和寬度,或者如果您願意,您可以使用縱橫比調整它的大小。

對於縱橫比調整大小,您可以嘗試使用以下代碼:

使新圖像的寬度和高度分別為原始圖像的一半:

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')

使用固定寬度和比例動態高度調整大小:

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')

最近版本的 Pillow 在PIL.ImageOps中有一些有用的方法。

根據您要實現的具體目標,您可能正在尋找其中之一:

  • ImageOps.fit(image, size [, …]) (docs) – 調整圖像大小,保持其縱橫比,並裁剪它以適合給定大小

  • ImageOps.contain(image, size [, …]) (docs) – 調整圖像大小,保持其縱橫比,使其適合給定大小

一個完整的例子:

import PIL.Image


class ImageUtils(object):
    @classmethod
    def resize_image(cls, image: PIL.Image.Image, width=None, height=None) -> PIL.Image.Image:
        if height is None and width is not None:
            height = image.height * width // image.width
        elif width is None and height is not None:
            width = image.width * height // image.height
        elif height is None and width is None:
            raise RuntimeError("At lease one of width and height must be present")
        return image.resize((width, height))


def main():
    ImageUtils.resize_image(PIL.Image.open("old.png"), width=100).save("new.png")


if __name__ == '__main__':
    main()

我認為以下是最簡單的方法:

Img1 = img.resize((img.size),PIL.Image.ANTIALIAS)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM