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) """