annotate montage/utils.py @ 0:b7348ffe5b46

initial import of montage
author k0s <k0scist@gmail.com>
date Mon, 07 Sep 2009 15:38:38 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
1 #!/usr/bin/env python
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
2
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
3 import os
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
4
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
5 from PIL import Image
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
6
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
7 def crop_resize(image, size):
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
8 """crop out the proportional middle of the image and set to the desired size"""
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
9 assert size[0] or size[1]
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
10
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
11 size = list(size)
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
12
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
13 if size[0] > image.size[0]:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
14 return image
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
15 if size[1] > image.size[1]:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
16 return image
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
17
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
18 image_ar = image.size[0]/float(image.size[1])
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
19 crop = not size[0] or not size[1]
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
20 if not size[1]:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
21 size[1] = int(image.size[1]*size[0]/float(image.size[0]) )
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
22 if not size[0]:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
23 size[0] = int(image.size[0]*size[1]/float(image.size[1]) )
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
24 size_ar = size[0]/float(size[1])
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
25
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
26 if crop:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
27 if image_ar > size_ar:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
28 # trim the width
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
29 xoffset = int(0.5*(image.size[0] - size_ar*image.size[1]))
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
30 image = image.crop((xoffset, 0, image.size[0]-xoffset, image.size[1]))
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
31 elif image_ar < size_ar:
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
32 # trim the height
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
33 yoffset = int(0.5*(image.size[1] - image.size[0]/size_ar))
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
34 image = image.crop((0, yoffset, image.size[0], image.size[1] - yoffset))
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
35
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
36 return image.resize(size, Image.ANTIALIAS)
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
37
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
38 if __name__ == '__main__':
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
39 from optparse import OptionParser
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
40 parser = OptionParser()
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
41 parser.add_option('-f', '--file')
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
42 parser.add_option('-W', '--width')
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
43 parser.add_option('-H', '--height')
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
44 (options, args) = parser.parse_args()
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
45
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
46 assert os.path.exists(options.file)
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
47
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
48 i = Image.open(options.file)
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
49 new_image = crop_resize(i, (int(options.width), int(options.height)))
b7348ffe5b46 initial import of montage
k0s <k0scist@gmail.com>
parents:
diff changeset
50 new_image.show()