File: thumbspage/docetc/pillow-thumb-size-scaling.py
"""
====================================================================
Demo how the Pillow library scales thumbnail size requests to
avoid changing aspect ratios. This runs the actual code Pillow
uses today (though it's morphed over time). In thumbspage, a
single size request is applied to all thumbnails in a gallery.
For more background, see UserGuide.html#thumbsizeinputs.
====================================================================
"""
import math
# Pillow's code
def round_aspect(number, key):
# rounding on steroids
return max(min(math.floor(number), math.ceil(number), key=key), 1)
def adjust(origwide, orighigh, x, y):
# scale x, y to preserve aspect ratio of orginal
aspect = origwide / orighigh
if x / y >= aspect:
x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y))
else:
y = round_aspect(x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n))
size = (x, y)
return size
# demo code
inputs = [(300, 100), (100, 300), (50, 50), (100, 100), (300, 300)]
sizes = [(100, 50), (50, 100), (100, 100), (1000, 3000), (25, 10)]
print('--By original size--')
for (origwide, orighigh) in sizes:
print('\nOriginal:', (origwide, orighigh))
for (x, y) in inputs:
print('\tinput', (x, y), '=>', adjust(origwide, orighigh, x, y))
print('\n--By input request--')
for (x, y) in inputs:
print('\nInput:', (x, y))
for (origwide, orighigh) in sizes:
print('\toriginal', (origwide, orighigh), '=>', adjust(origwide, orighigh, x, y))
"""
=========================================================================================
OUTPUT:
--By original size--
Original: (100, 50)
input (300, 100) => (200, 100)
input (100, 300) => (100, 50)
input (50, 50) => (50, 25)
input (100, 100) => (100, 50)
input (300, 300) => (300, 150)
Original: (50, 100)
input (300, 100) => (50, 100)
input (100, 300) => (100, 200)
input (50, 50) => (25, 50)
input (100, 100) => (50, 100)
input (300, 300) => (150, 300)
Original: (100, 100)
input (300, 100) => (100, 100)
input (100, 300) => (100, 100)
input (50, 50) => (50, 50)
input (100, 100) => (100, 100)
input (300, 300) => (300, 300)
Original: (1000, 3000)
input (300, 100) => (33, 100)
input (100, 300) => (100, 300)
input (50, 50) => (17, 50)
input (100, 100) => (33, 100)
input (300, 300) => (100, 300)
Original: (25, 10)
input (300, 100) => (250, 100)
input (100, 300) => (100, 40)
input (50, 50) => (50, 20)
input (100, 100) => (100, 40)
input (300, 300) => (300, 120)
--By input request--
Input: (300, 100)
original (100, 50) => (200, 100)
original (50, 100) => (50, 100)
original (100, 100) => (100, 100)
original (1000, 3000) => (33, 100)
original (25, 10) => (250, 100)
Input: (100, 300)
original (100, 50) => (100, 50)
original (50, 100) => (100, 200)
original (100, 100) => (100, 100)
original (1000, 3000) => (100, 300)
original (25, 10) => (100, 40)
Input: (50, 50)
original (100, 50) => (50, 25)
original (50, 100) => (25, 50)
original (100, 100) => (50, 50)
original (1000, 3000) => (17, 50)
original (25, 10) => (50, 20)
Input: (100, 100)
original (100, 50) => (100, 50)
original (50, 100) => (50, 100)
original (100, 100) => (100, 100)
original (1000, 3000) => (33, 100)
original (25, 10) => (100, 40)
Input: (300, 300)
original (100, 50) => (300, 150)
original (50, 100) => (150, 300)
original (100, 100) => (300, 300)
original (1000, 3000) => (100, 300)
original (25, 10) => (300, 120)
"""