diff --git a/imagekit/defaults.py b/imagekit/defaults.py index e1a05f6..6500a86 100644 --- a/imagekit/defaults.py +++ b/imagekit/defaults.py @@ -15,7 +15,11 @@ class EnhanceSmall(processors.Adjustment): class SampleReflection(processors.Reflection): size = 0.5 background_color = "#000000" + +class PNGFormat(processors.Format): + format = 'PNG' + extension = 'png' class DjangoAdminThumbnail(ImageSpec): access_as = 'admin_thumbnail' - processors = [ResizeThumbnail, EnhanceSmall, SampleReflection] + processors = [ResizeThumbnail, EnhanceSmall, SampleReflection, PNGFormat] diff --git a/imagekit/processors.py b/imagekit/processors.py index eb8926a..9bcdc3c 100644 --- a/imagekit/processors.py +++ b/imagekit/processors.py @@ -14,7 +14,7 @@ class ImageProcessor(object): @classmethod def process(cls, img, fmt, obj): return img, fmt - + class Adjustment(ImageProcessor): color = 1.0 @@ -35,6 +35,15 @@ class Adjustment(ImageProcessor): return img, fmt +class Format(ImageProcessor): + format = 'JPEG' + extension = 'jpg' + + @classmethod + def process(cls, img, fmt, obj): + return img, cls.format + + class Reflection(ImageProcessor): background_color = '#FFFFFF' size = 0.0 diff --git a/imagekit/specs.py b/imagekit/specs.py index 9ec34b0..a3097a1 100644 --- a/imagekit/specs.py +++ b/imagekit/specs.py @@ -7,6 +7,7 @@ spec found. """ import os from StringIO import StringIO +from imagekit import processors from imagekit.lib import * from imagekit.utils import img_to_fobj from django.core.files.base import ContentFile @@ -29,12 +30,13 @@ class ImageSpec(object): for proc in cls.processors: img, fmt = proc.process(img, fmt, obj) img.format = fmt - return img + return img, fmt class Accessor(object): def __init__(self, obj, spec): self._img = None + self._fmt = None self._obj = obj self.spec = spec @@ -55,7 +57,10 @@ class Accessor(object): fp = self._obj._imgfield.storage.open(self._obj._imgfield.name) fp.seek(0) fp = StringIO(fp.read()) - self._img = self.spec.process(Image.open(fp), self._obj) + self._img, self._fmt = self.spec.process(Image.open(fp), self._obj) + for key, val in Image.EXTENSION.iteritems(): + if val == self._fmt: + extension = key # save the new image to the cache content = ContentFile(self._get_imgfile().read()) self._obj._imgfield.storage.save(self.name, content) @@ -69,6 +74,9 @@ class Accessor(object): def _basename(self): filename, extension = \ os.path.splitext(os.path.basename(self._obj._imgfield.name)) + for processor in self.spec.processors: + if issubclass(processor, processors.Format): + extension = processor.extension return self._obj._ik.cache_filename_format % \ {'filename': filename, 'specname': self.spec.name(), diff --git a/imagekit/tests.py b/imagekit/tests.py index 8c2eb5e..4d6f3f3 100644 --- a/imagekit/tests.py +++ b/imagekit/tests.py @@ -53,8 +53,8 @@ class IKTest(TestCase): Image.new('RGB', (800, 600)).save(self.tmp, 'JPEG') self.tmp.seek(0) self.p = TestPhoto() - self.p.image.save(os.path.basename('test.jpg'), - ContentFile(self.tmp.read())) + self.p.image.save(os.path.basename('test.jpeg'), + ContentFile(self.tmp.read())) self.p.save() # destroy temp file self.tmp.close() @@ -76,7 +76,7 @@ class IKTest(TestCase): self.assertEqual(self.p.cropped.height, 100) def test_url(self): - tup = (settings.MEDIA_URL, self.p._ik.cache_dir, 'test_to_width.jpg') + tup = (settings.MEDIA_URL, self.p._ik.cache_dir, 'test_to_width.jpeg') self.assertEqual(self.p.to_width.url, "%s%s/%s" % tup) def tearDown(self): diff --git a/imagekit/utils.py b/imagekit/utils.py index 28ee937..3ed7ce9 100644 --- a/imagekit/utils.py +++ b/imagekit/utils.py @@ -4,11 +4,6 @@ import tempfile def img_to_fobj(img, format, **kwargs): tmp = tempfile.TemporaryFile() - if format != 'JPEG': - try: - img.save(tmp, format, **kwargs) - except KeyError: - pass img.save(tmp, format, **kwargs) tmp.seek(0) return tmp