13

次の PIL コードを使用して、画像ファイルをサムネイル化し、トリミングしています。

        image = Image.open(filename)
        image.thumbnail(size, Image.ANTIALIAS)
        image_size = image.size
        thumb = image.crop( (0, 0, size[0], size[1]) )
        offset_x = max( (size[0] - image_size[0]) / 2, 0 )
        offset_y = max( (size[1] - image_size[1]) / 2, 0 )
        thumb = ImageChops.offset(thumb, offset_x, offset_y)                
        thumb.convert('RGBA').save(filename, 'JPEG')

これはうまく機能しますが、画像の縦横比が同じでない場合、違いが黒色 (またはアルファ チャネル) で埋められます。塗りつぶしは問題ありません。塗りつぶしの色を選択できるようにしたいのですが、アルファチャンネルを選択することをお勧めします。

出力例:

出力

塗りつぶしの色を指​​定するにはどうすればよいですか?

4

2 に答える 2

22

透明度を含む独自の背景色を指定できるように、コードを少し変更しました。このコードは、指定された画像を PIL.Image オブジェクトに読み込み、指定されたサイズからサムネイルを生成してから、その画像を別のフル サイズのサーフェスに貼り付けます。 (色に使用されるタプルは任意の RGBA 値にすることもできることに注意してください。ここでは、アルファ/透明度 0 の白を使用しました。)


# assuming 'import from PIL *' is preceding
thumbnail = Image.open(filename)
# generating the thumbnail from given size
thumbnail.thumbnail(size, Image.ANTIALIAS)

offset_x = max((size[0] - thumbnail.size[0]) / 2, 0)
offset_y = max((size[1] - thumbnail.size[1]) / 2, 0)
offset_tuple = (offset_x, offset_y) #pack x and y into a tuple

# create the image object to be the final product
final_thumb = Image.new(mode='RGBA',size=size,color=(255,255,255,0))
# paste the thumbnail into the full sized image
final_thumb.paste(thumbnail, offset_tuple)
# save (the PNG format will retain the alpha band unlike JPEG)
final_thumb.save(filename,'PNG')
于 2012-07-29T09:18:15.217 に答える
16

pasteサムネイル画像のサイズを変更して、必要な色 (およびアルファ値) の新しい画像にする方が少し簡単です。

RGBA画像を作成し、次のようなタプルでその色を指定できます。

Image.new('RGBA', size, (255,0,0,255))

ここでは、アルファ バンドが 255 に設定されているため、透明度はありません。ただし、背景は赤になります。この画像を貼り付けて、次のような任意の色のサムネイルを作成できます。

ここに画像の説明を入力

アルファ バンドを に設定すると、透明な画像に適用0でき、次のようになります。paste

ここに画像の説明を入力

コード例:

import Image

image = Image.open('1_tree_small.jpg')
size=(50,50)
image.thumbnail(size, Image.ANTIALIAS)
# new = Image.new('RGBA', size, (255, 0, 0, 255))  #without alpha, red
new = Image.new('RGBA', size, (255, 255, 255, 0))  #with alpha
new.paste(image,((size[0] - image.size[0]) / 2, (size[1] - image.size[1]) / 2))
new.save('saved4.png')
于 2012-07-29T10:00:39.140 に答える