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