diff --git a/sigal/image.py b/sigal/image.py index bb4e670..787f8b4 100644 --- a/sigal/image.py +++ b/sigal/image.py @@ -29,6 +29,7 @@ from __future__ import division import logging import os +import sys from exceptions import IOError from PIL import Image as PILImage from PIL import ImageDraw, ImageOps, ImageFile @@ -73,16 +74,16 @@ class Image(object): http://github.com/jdriscoll/django-imagekit/issues/91 """ - with open(filename, 'wb') as fp: + try: + with quiet(): + self.img.save(filename, "JPEG", **kwargs) + except IOError: + old_maxblock = ImageFile.MAXBLOCK + ImageFile.MAXBLOCK = self.img.size[0] * self.img.size[1] try: - self.img.save(fp, "JPEG", **kwargs) - except IOError: - old_maxblock = ImageFile.MAXBLOCK - ImageFile.MAXBLOCK = self.img.size[0] * self.img.size[1] - try: - self.img.save(fp, "JPEG", **kwargs) - finally: - ImageFile.MAXBLOCK = old_maxblock + self.img.save(filename, "JPEG", **kwargs) + finally: + ImageFile.MAXBLOCK = old_maxblock def resize(self, size): """Resize the image. @@ -126,6 +127,23 @@ class Image(object): self.img.save(filename, quality=quality) +class quiet(object): + """A context manager for suppressing the stderr activity of PIL's C + libraries. Based on http://stackoverflow.com/a/978264/155370 + + """ + def __enter__(self): + self.stderr_fd = sys.__stderr__.fileno() + self.null_fd = os.open(os.devnull, os.O_RDWR) + self.old = os.dup(self.stderr_fd) + os.dup2(self.null_fd, self.stderr_fd) + + def __exit__(self, *args, **kwargs): + os.dup2(self.old, self.stderr_fd) + os.close(self.null_fd) + os.close(self.old) + + def copy_exif(srcfile, dstfile): "Copy the exif metadatas from src to dest images"