diff --git a/jsignature/utils.py b/jsignature/utils.py index eb3dc9a..c59cf72 100644 --- a/jsignature/utils.py +++ b/jsignature/utils.py @@ -4,7 +4,7 @@ """ import json from itertools import chain -from PIL import Image, ImageDraw, ImageOps +from PIL import Image, ImageDraw, ImageOps, __version__ as PIL_VERSION AA = 5 # super sampling gor antialiasing @@ -29,16 +29,25 @@ def _remove_empty_pts(pt): raise ValueError # Compute box - width = int(round(max(chain(*[d['x'] for d in drawing])))) + 10 - height = int(round(max(chain(*[d['y'] for d in drawing])))) + 10 + min_width = int(round(min(chain(*[d['x'] for d in drawing])))) - 10 + max_width = int(round(max(chain(*[d['x'] for d in drawing])))) + 10 + width = max_width - min_width + min_height = int(round(min(chain(*[d['y'] for d in drawing])))) - 10 + max_height = int(round(max(chain(*[d['y'] for d in drawing])))) + 10 + height = max_height - min_height # Draw image im = Image.new("RGBA", (width * AA, height * AA)) draw = ImageDraw.Draw(im) for line in drawing: len_line = len(line['x']) - points = [(line['x'][i] * AA, line['y'][i] * AA) - for i in range(0, len_line)] + points = [ + ( + (line['x'][i] - min_width) * AA, + (line['y'][i] - min_height) * AA + ) + for i in range(0, len_line) + ] draw.line(points, fill="#000", width=2 * AA) im = ImageOps.expand(im) # Smart crop @@ -46,7 +55,11 @@ def _remove_empty_pts(pt): if bbox: im.crop(bbox) - im.thumbnail((width, height), Image.ANTIALIAS) + old_pil_version = int(PIL_VERSION.split('.')[0]) < 10 + im.thumbnail( + (width, height), + Image.ANTIALIAS if old_pil_version else Image.LANCZOS + ) if as_file: ret = im._dump(format='PNG') diff --git a/tests/test_filter.py b/tests/test_filter.py index e79800b..ce9bca9 100644 --- a/tests/test_filter.py +++ b/tests/test_filter.py @@ -16,4 +16,4 @@ def test_inputs_bad_type_value(self): def test_outputs_as_base64(self): output = signature_base64(DUMMY_STR_VALUE) - self.assertEqual(output, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANwAAABNCAYAAADNYApnAAABIklEQVR4nO3ZP0odURjG4d/ce5dgE3EHgXTp07iD6B7cga3YpUoh7iFrCti4BkGw0OLMoEVIEW4yxPs81ZxzGPial+/8KQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPh3ttW0dhFwCN4GbbNaFXAAlrCdVh/m791KtcC7tmkE7mP1XP2sPs1rQgd7NjVCd1TdNkL3UJ2tWRQciovqqRG8q0aXc6aDPZsat5RVX6q7Rui+zXPbX/wD/KFla7mc306qH9XneazLwZ4s3eu8eqwuV6wF3rXllvK4um9sI7/Oc7s8hMNeLVf/3xthu5nHzmzwF0y9drjrxvPAMgcA/7/lWUBnAwAAAAAAfucFwt4TZmdXW+AAAAAASUVORK5CYII=") + self.assertEqual(output, "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAcCAYAAACUJBTQAAAAuElEQVR4nO3TMQ4BQRSH8d8uR9AQN5Do9Bo3wB3cQCs6lULcwZkkGmeQSBQU+yZEVIxC7FfNvGTnm7fvP9TU/A0NFN8UPB5eflMwQjvWzZyCMiQ9XLFHP7eoCFEL2xCdMMkleMUMl5AtVN1km1GhShcMcQjRKmqNF9+8JSnd59HFDoPYf9xNuuUUZ8w/PfCZlK4OjqpfNI5aU6bHmWK6DsEm9llmkCjcO1mqopxqv0mK8O92UFPzPjdRMBNmBFDqcwAAAABJRU5ErkJggg==")