image: improve image handling, caption, resize
[treecutter.git] / treecutter / image.py
1 #!/usr/bin/python
2
3 from PIL import Image as PIL_Image
4 from libxmp import consts
5 from libxmp import XMPFiles
6 from treecutter.tools import sizeof_fmt
7 import os
8
9 import subprocess
10 import errno
11
12 class Image():
13     """Class representing an image"""
14     def __init__(self,filename):
15         self._filename = filename
16         self._format = {}
17
18     def filename(self):
19         return self._filename
20
21     def infostr(self):
22         im = PIL_Image.open(self._filename)
23         w,d = im.size
24         im.close()
25         byte = os.path.getsize(self._filename)
26         return "[%dx%d (%s)]" % (w,d,sizeof_fmt(byte))
27
28     def resize(self,x,y,pad=0):
29         size = (x, y)
30         outfile, ext = os.path.splitext(self._filename)
31         outfile = "%s.%dx%d%s" % (outfile, size[0], size[1], ext)
32         if not os.path.exists(outfile):
33             im = PIL_Image.open(self._filename)
34             im.thumbnail(size, PIL_Image.ANTIALIAS)
35             if pad:
36                 bg = PIL_Image.new('RGBA', size, (0, 0, 0, 0))
37                 bg.paste(im,((size[0]-im.size[0])/2, (size[1]-im.size[1])/2))
38                 bg.save(outfile)
39             else:
40                 im.save(outfile)
41             im.close()
42             xmpfile = XMPFiles(file_path=outfile)
43             xmp = xmpfile.get_xmp()
44             if xmp:
45                 xmp.set_property(consts.XMP_NS_XMP, u'CreatorTool',u'treecutter')
46                 if xmpfile.can_put_xmp(xmp):
47                     xmpfile.put_xmp(xmp)
48                 else:
49                     cmd = ['exiftool', '-XMP:CreatorTool=treecutter','-quiet','-overwrite_original', outfile]
50                     retcode = subprocess.call(cmd)
51                     if retcode:
52                         print 'Error: '+' '.join(cmd)+' Returncode ['+str(retcode)+']'
53                         exit
54             xmpfile.close_file()
55             self._format[size] = outfile
56         return outfile
57
58     def generated(self):
59         xmpfile = XMPFiles(file_path=self._filename)
60         xmp = xmpfile.get_xmp()
61         cr = None
62         if xmp.does_property_exist(consts.XMP_NS_XMP, u'CreatorTool'):
63             cr = xmp.get_property(consts.XMP_NS_XMP, u'CreatorTool')
64         return cr == u'treecutter'
65
66     def thumbnail(self):
67         return self.resize(50,50,1)
68
69     def slider(self):
70         return self.resize(700,438,1)
71
72     def caption(self):
73         cap = "Beskrivning saknas"
74         xmpfile = XMPFiles(file_path=self._filename)
75         xmp = xmpfile.get_xmp()
76         if xmp:
77             if xmp.does_property_exist(consts.XMP_NS_DC, 'description[1]'):
78                 cap = xmp.get_property(consts.XMP_NS_DC, 'description[1]')
79         xmpfile.close_file()
80         return cap