Mercurial > hg > cropresize
comparison cropresize/__init__.py @ 0:0a54e5bd2875
initial import of cropresive from https://svn.openplans.org/svn/standalone/cropresize
author | k0s <k0scist@gmail.com> |
---|---|
date | Thu, 29 Oct 2009 18:28:13 -0400 |
parents | |
children | 6ec33e2ce60f |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:0a54e5bd2875 |
---|---|
1 #!/usr/bin/env python | |
2 | |
3 import sys | |
4 from PIL import Image | |
5 | |
6 def crop_resize(image, size, exact_size=False): | |
7 """ | |
8 Crop out the proportional middle of the image and set to the desired size. | |
9 If the image is bigger than the sizes passed, this works as expected. | |
10 If the image is smaller than the sizes passed, then behavior is dictated | |
11 by the `exact_size` flag. If the | |
12 | |
13 """ | |
14 assert size[0] or size[1] | |
15 | |
16 size = list(size) | |
17 | |
18 image_ar = image.size[0]/float(image.size[1]) | |
19 crop = size[0] and size[1] | |
20 if not size[1]: | |
21 size[1] = int(image.size[1]*size[0]/float(image.size[0]) ) | |
22 if not size[0]: | |
23 size[0] = int(image.size[0]*size[1]/float(image.size[1]) ) | |
24 size_ar = size[0]/float(size[1]) | |
25 | |
26 if size[0] > image.size[0]: | |
27 if size[1] > image.size[1]: | |
28 if not exact_size: | |
29 return image | |
30 else: | |
31 pass | |
32 # raise NotImplementedError | |
33 elif size[1] > image.size[1]: | |
34 pass | |
35 | |
36 if crop: | |
37 if image_ar > size_ar: | |
38 # trim the width | |
39 xoffset = int(0.5*(image.size[0] - size_ar*image.size[1])) | |
40 image = image.crop((xoffset, 0, image.size[0]-xoffset, image.size[1])) | |
41 elif image_ar < size_ar: | |
42 # trim the height | |
43 yoffset = int(0.5*(image.size[1] - image.size[0]/size_ar)) | |
44 image = image.crop((0, yoffset, image.size[0], image.size[1] - yoffset)) | |
45 | |
46 return image.resize(size, Image.ANTIALIAS) | |
47 | |
48 def main(): | |
49 from optparse import OptionParser | |
50 parser = OptionParser() | |
51 parser.add_option('-W', '--width') | |
52 parser.add_option('-H', '--height') | |
53 parser.add_option('-e', '--exact-size', dest='exact', action='store_true', default=False) | |
54 (options, args) = parser.parse_args() | |
55 | |
56 if not args: | |
57 parser.print_help() | |
58 sys.exit() | |
59 | |
60 width = int(options.width) | |
61 height = int(options.height) | |
62 | |
63 for arg in args: | |
64 image = Image.open(arg) | |
65 new_image = crop_resize(image, (width, height), options.exact) | |
66 new_image.show() | |
67 | |
68 if __name__ == '__main__': | |
69 main() |