39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
from io import BytesIO
|
|
try:
|
|
from PIL import Image as im
|
|
IMAGE_UTILS_AVAILABLE = True
|
|
Image = im.open
|
|
def resize(image, size):
|
|
output = BytesIO()
|
|
back = im.new('RGBA', size, (0,0,0,0))
|
|
image.thumbnail(size, im.ANTIALIAS)
|
|
offset = [0,0]
|
|
if image.size[0] >= image.size[1]:
|
|
offset[1] = int(back.size[1]/2-image.size[1]/2)
|
|
else:
|
|
offset[0] = int(back.size[0]/2-image.size[0]/2)
|
|
back.paste(image, tuple(offset))
|
|
back.save(output, image.format)
|
|
contents = output.getvalue()
|
|
output.close()
|
|
return contents
|
|
except ImportError:
|
|
IMAGE_UTILS_AVAILABLE = False
|
|
|
|
LARGEST_ICON_SIZE = 1024
|
|
SMALLEST_ICON_SIZE = 16
|
|
sizes = [LARGEST_ICON_SIZE,512,256,128,48,32,SMALLEST_ICON_SIZE]
|
|
|
|
def nearest_icon_size(width, height):
|
|
maximum = max(width, height)
|
|
|
|
if maximum >= LARGEST_ICON_SIZE:
|
|
return LARGEST_ICON_SIZE
|
|
if maximum <= SMALLEST_ICON_SIZE:
|
|
return SMALLEST_ICON_SIZE
|
|
|
|
for i in range(len(sizes)-1):
|
|
current_size = sizes[i]
|
|
next_size = sizes[i+1]
|
|
if current_size > maximum >= next_size:
|
|
return next_size
|