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



[Home page] Books Code Blog Python Author Train Find ©M.Lutz