summaryrefslogtreecommitdiff
path: root/openerp/tools/image.py
diff options
context:
space:
mode:
authorChristophe Simonis <chs@odoo.com>2014-10-01 19:18:14 +0200
committerChristophe Simonis <chs@odoo.com>2014-10-01 19:18:14 +0200
commit709c9868de7c4ac4985ed4e0055ae3e3e49742ad (patch)
treee90227a947bddf47b3043fcbe8b99529a22aa7dd /openerp/tools/image.py
parent85f26244a71a0b9a7faa283d6d24fdde6bae899a (diff)
parente8831932464814ed5f9e3a0af33f98891a466417 (diff)
[MERGE] forward port of branch 8.0 up to e883193
Diffstat (limited to 'openerp/tools/image.py')
-rw-r--r--openerp/tools/image.py51
1 files changed, 44 insertions, 7 deletions
diff --git a/openerp/tools/image.py b/openerp/tools/image.py
index 93458fb9408..aa110d7825e 100644
--- a/openerp/tools/image.py
+++ b/openerp/tools/image.py
@@ -88,13 +88,7 @@ def image_resize_image(base64_source, size=(1024, 1024), encoding='base64', file
return base64_source
if image.size != size:
- # create a thumbnail: will resize and keep ratios, then sharpen for better looking result
- image.thumbnail(size, Image.ANTIALIAS)
- sharpener = ImageEnhance.Sharpness(image.convert('RGBA'))
- resized_image = sharpener.enhance(2.0)
- # create a transparent image for background and paste the image on it
- image = Image.new('RGBA', size, (255, 255, 255, 0))
- image.paste(resized_image, ((size[0] - resized_image.size[0]) / 2, (size[1] - resized_image.size[1]) / 2))
+ image = image_resize_and_sharpen(image, size)
if image.mode not in ["1", "L", "P", "RGB", "RGBA"]:
image = image.convert("RGB")
@@ -102,6 +96,49 @@ def image_resize_image(base64_source, size=(1024, 1024), encoding='base64', file
image.save(background_stream, filetype)
return background_stream.getvalue().encode(encoding)
+def image_resize_and_sharpen(image, size, factor=2.0):
+ """
+ Create a thumbnail by resizing while keeping ratio.
+ A sharpen filter is applied for a better looking result.
+
+ :param image: PIL.Image.Image()
+ :param size: 2-tuple(width, height)
+ :param factor: Sharpen factor (default: 2.0)
+ """
+ if image.mode != 'RGBA':
+ image = image.convert('RGBA')
+ image.thumbnail(size, Image.ANTIALIAS)
+ size = image.size
+ sharpener = ImageEnhance.Sharpness(image)
+ resized_image = sharpener.enhance(factor)
+ # create a transparent image for background and paste the image on it
+ image = Image.new('RGBA', size, (255, 255, 255, 0))
+ image.paste(resized_image, ((size[0] - resized_image.size[0]) / 2, (size[1] - resized_image.size[1]) / 2))
+ return image
+
+def image_save_for_web(image, fp=None, format=None):
+ """
+ Save image optimized for web usage.
+
+ :param image: PIL.Image.Image()
+ :param fp: File name or file object. If not specified, a bytestring is returned.
+ :param format: File format if could not be deduced from image.
+ """
+ opt = dict(format=image.format or format)
+ if image.format == 'PNG':
+ opt.update(optimize=True)
+ if image.mode != 'P':
+ # Floyd Steinberg dithering by default
+ image = image.convert('RGBA').convert('P', palette=Image.WEB, colors=256)
+ elif image.format == 'JPEG':
+ opt.update(optimize=True, quality=80)
+ if fp:
+ image.save(fp, **opt)
+ else:
+ img = StringIO.StringIO()
+ image.save(img, **opt)
+ return img.getvalue()
+
def image_resize_image_big(base64_source, size=(1204, 1024), encoding='base64', filetype=None, avoid_if_small=True):
""" Wrapper on image_resize_image, to resize images larger than the standard
'big' image size: 1024x1024px.