1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | def rescale(data, width, height, force=True):
"""Rescale the given image, optionally cropping it to make sure the result image has the specified width and height."""
import Image as pil
from cStringIO import StringIO
max_width = width
max_height = height
input_file = StringIO(data)
img = pil.open(input_file)
if not force:
img.thumbnail((max_width, max_height), pil.ANTIALIAS)
else:
src_width, src_height = img.size
src_ratio = float(src_width) / float(src_height)
dst_width, dst_height = max_width, max_height
dst_ratio = float(dst_width) / float(dst_height)
if dst_ratio < src_ratio:
crop_height = src_height
crop_width = crop_height * dst_ratio
x_offset = float(src_width - crop_width) / 2
y_offset = 0
else:
crop_width = src_width
crop_height = crop_width / dst_ratio
x_offset = 0
y_offset = float(src_height - crop_height) / 3
img = img.crop((x_offset, y_offset, x_offset+int(crop_width), y_offset+int(crop_height)))
img = img.resize((dst_width, dst_height), pil.ANTIALIAS)
tmp = StringIO()
img.save(tmp, 'JPEG')
tmp.seek(0)
output_data = tmp.getvalue()
input_file.close()
tmp.close()
return output_data
|
Comments