web-dev-qa-db-ja.com

Python / Pillow:画像を拡大縮小する方法

2322px x 4128pxの画像があるとします。幅と高さの両方が1028px未満になるようにスケーリングするにはどうすればよいですか?

Image.resizehttps://pillow.readthedocs.io/en/latest/reference/Image.html#PIL.Image.Image.resize )を使用することはできませんそれには、新しい幅と高さの両方を指定する必要があります。私がやろうとしているのは、以下の擬似コードです:

if (image.width or image.height) > 1028:
    if image.width > image.height:
        tn_image = image.scale(make width of image 1028)
        # since the height is less than the width and I am scaling the image
        # and making the width less than 1028px, the height will surely be
        # less than 1028px
    else: #image's height is greater than it's width
        tn_image = image.scale(make height of image 1028)

Image.thumbnailを使用する必要があると思いますが、この例によると( http://pillow.readthedocs.org/en/latest/reference/Image.html#create-thumbnails )この答え( PILを使用して画像のサイズを変更し、そのアスペクト比を維持するにはどうすればよいですか? )、サムネイルを作成するために幅と高さの両方が提供されます。新しい幅または新しい高さ(両方ではない)を取り、画像全体を拡大縮小する関数はありますか?

30
user2719875

車輪を再発明する必要はありません。これに利用できる Image.thumbnail メソッドがあります。

maxsize = (1028, 1028)
image.thumbnail(maxsize, PIL.Image.ANTIALIAS)

アスペクト比を維持しながら、結果のサイズが指定された境界より大きくならないようにします。

PIL.Image.ANTIALIASを指定すると、サイズ変更の結果を改善するために高品質のダウンサンプリングフィルターが適用されます。

59
famousgarkin

Image.resizeを使用しますが、幅と高さの両方を計算します。

if image.width > 1028 or image.height > 1028:
    if image.height > image.width:
        factor = 1028 / image.height
    else:
        factor = 1028 / image.width
    tn_image = image.resize((int(image.width * factor), int(image.height * factor)))
14
Sohcahtoa82