Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: imageConversion.py

Issue 4829354802544640: Issue 1883 - Work around another PIL bug by using RGBA insted LA (Closed)
Patch Set: Created Jan. 27, 2015, 4:10 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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()
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld