OLD | NEW |
1 # coding: utf-8 | 1 # coding: utf-8 |
2 | 2 |
3 # This Source Code Form is subject to the terms of the Mozilla Public | 3 # This Source Code Form is subject to the terms of the Mozilla Public |
4 # License, v. 2.0. If a copy of the MPL was not distributed with this | 4 # License, v. 2.0. If a copy of the MPL was not distributed with this |
5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. | 5 # file, You can obtain one at http://mozilla.org/MPL/2.0/. |
6 | 6 |
7 import os | 7 import os |
8 import re | 8 import re |
9 from StringIO import StringIO | 9 from StringIO import StringIO |
10 | 10 |
11 try: | 11 try: |
12 from PIL import Image | 12 from PIL import Image |
13 from PIL import ImageOps | 13 from PIL import ImageOps |
14 except ImportError: | 14 except ImportError: |
15 import Image | 15 import Image |
16 import ImageOps | 16 import ImageOps |
17 | 17 |
18 def get_alpha(image): | 18 def get_alpha(image): |
19 if image.mode in ('RGBA', 'LA'): | 19 if image.mode in ('RGBA', 'LA'): |
20 return image.split()[image.getbands().index('A')] | 20 return image.split()[image.getbands().index('A')] |
21 | 21 |
22 # In order to generate an alpha channel for images using a palette, we | 22 # In order to generate an alpha channel for images using a palette, we |
23 # convert the image to grayscale+alpha. Initially, we created an alpha | 23 # convert the image to RGBA. It's important to use RGBA, not LA (grayscale+alp
ha), |
24 # channel by replacing opaque pixels with a high mark and transparent | 24 # since PIL can't reliably convert P to LA. Also initially, we created an |
| 25 # alpha channel by replacing opaque pixels with a high mark and transparent |
25 # pixels with a low mark. However, it turned out that you can't rely on the | 26 # pixels with a low mark. However, it turned out that you can't rely on the |
26 # value of Image.info['transparency'] since in some cases it might be an | 27 # value of Image.info['transparency'] since in some cases it might be an |
27 # unparsed string instead an int indicating the value of transparent pixels. | 28 # unparsed string instead an int indicating the value of transparent pixels. |
28 if image.mode == 'P' and 'transparency' in image.info: | 29 if image.mode == 'P' and 'transparency' in image.info: |
29 return image.convert('LA').split()[1] | 30 return image.convert('RGBA').split()[4] |
30 | 31 |
31 def load_image(path): | 32 def load_image(path): |
32 image = Image.open(path) | 33 image = Image.open(path) |
33 # Make sure the image is loaded, some versions of PIL load images lazily. | 34 # Make sure the image is loaded, some versions of PIL load images lazily. |
34 image.load() | 35 image.load() |
35 return image | 36 return image |
36 | 37 |
37 def ensure_same_mode(im1, im2): | 38 def ensure_same_mode(im1, im2): |
38 # if both images already have the same mode (and palette, in | 39 # if both images already have the same mode (and palette, in |
39 # case of mode P), don't convert anything. Images with mode P, | 40 # case of mode P), don't convert anything. Images with mode P, |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
115 | 116 |
116 for step in steps: | 117 for step in steps: |
117 filter, args = re.match(r'([^(]+)(?:\((.*)\))?', step).groups() | 118 filter, args = re.match(r'([^(]+)(?:\((.*)\))?', step).groups() |
118 args = re.split(r'\s*,\s*', args) if args else () | 119 args = re.split(r'\s*,\s*', args) if args else () |
119 image = globals()['filter_' + filter](image, baseDir, *args) | 120 image = globals()['filter_' + filter](image, baseDir, *args) |
120 | 121 |
121 f = StringIO() | 122 f = StringIO() |
122 f.name = filename | 123 f.name = filename |
123 image.save(f) | 124 image.save(f) |
124 files[filename] = f.getvalue() | 125 files[filename] = f.getvalue() |
OLD | NEW |