57

呼び出し

image = Image.open(data)
image.thumbnail((36,36), Image.NEAREST)

アスペクト比を維持します。しかし、私は次のような画像を表示する必要があります:

<img src="/media/image.png" style="height:36px; width:36px" />

画像の周囲を透明または白のレターボックススタイルにすることはできますか?

4

7 に答える 7

168

PILには、まさにそれを行う機能がすでにあります。

from PIL import Image, ImageOps
thumb = ImageOps.fit(image, size, Image.ANTIALIAS)
于 2011-12-12T04:25:06.603 に答える
82

背景として適切なサイズの透明な画像に画像を貼り付けます

from PIL import Image
size = (36, 36)
image = Image.open(data)
image.thumbnail(size, Image.ANTIALIAS)
background = Image.new('RGBA', size, (255, 255, 255, 0))
background.paste(
    image, (int((size[0] - image.size[0]) / 2), int((size[1] - image.size[1]) / 2))
)
background.save("output.png")

編集:構文エラーを修正しました

于 2009-09-06T18:45:01.213 に答える
3
from PIL import Image

import StringIO

def thumbnail_image():
    image = Image.open("image.png")
    image.thumbnail((300, 200))
    thumb_buffer = StringIO.StringIO()
    image.save(thumb_buffer, format=image.format)
    fp = open("thumbnail.png", "w")
    fp.write(thumb_buffer.getvalue())
    fp.close()
于 2016-07-28T08:30:28.387 に答える
2

CesarCanassaの回答の更新。

これにより、次のサムネイルが作成image.jpgされimage_thumb.jpgます。

from PIL import Image, ImageOps
fname = 'image.jpg'
size = (48,48)
thumb = ImageOps.fit(Image.open(fname), size, Image.ANTIALIAS)
thumb.save('{}_thumb.jpg'.format(fname[:fname.rfind('.')]), "JPEG")
于 2019-10-24T08:47:43.660 に答える
1

またはこれ、多分...(スパゲッティを許して)

from PIL import Image

def process_image(image, size):
    if image.size[0] > size[0] or image.size[1] > size[1]:
        #preserve original
        thumb = image.copy()
        thumb.thumbnail(size,Image.ANTIALIAS)
        img = thumb.copy()
    img_padded = Image.new("RGBA",size)
    img_padded.paste(image,(int((size[0]-image.size[0])/2),int((size[1]-image.size[1])/2)))
    return img_padded
于 2015-01-31T02:26:01.217 に答える
1

単純にサイズ変更方法を使用してみませんか?

from PIL import Image
image = Image.open('/path/to/img.png')
image = image.resize((36,36), Image.ANTIALIAS)

このリリースノートの画像サイズ変更に関する推奨事項を参照してください: https ://pillow.readthedocs.io/en/stable/releasenotes/5.3.0.html

于 2019-12-10T15:28:04.857 に答える
0

ナディアの答えをこの関数でラップすることができます。これにより、サイズと背景を制御できます。

def make_square(im, min_size=36, fill_color=(255, 255, 255, 0)):
    x, y = im.size
    size = min(min_size, x, y)
    new_im = Image.new('RGBA', (size, size), fill_color)
    im.thumbnail((256, 256))
    new_im.paste(im, (int((x - size) / 2), int((y -size) / 2))
    return new_im
于 2018-11-20T03:32:33.920 に答える