Put back the quiet context manager, with a fix for the file descriptors leak.

This commit is contained in:
Simon
2013-03-01 01:00:36 +01:00
parent 099f6e15e3
commit 976472c795

View File

@@ -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"