Merge pull request #2129 from radarhere/truth

Use truth value when checking for optimize option on save
This commit is contained in:
wiredfool 2016-09-26 14:28:23 +01:00 committed by GitHub
commit 2401150ce9
4 changed files with 29 additions and 25 deletions

View File

@ -688,12 +688,14 @@ def _save(im, fp, filename):
progressive = info.get("progressive", False) or\ progressive = info.get("progressive", False) or\
info.get("progression", False) info.get("progression", False)
optimize = info.get("optimize", False)
# get keyword arguments # get keyword arguments
im.encoderconfig = ( im.encoderconfig = (
quality, quality,
progressive, progressive,
info.get("smooth", 0), info.get("smooth", 0),
"optimize" in info, optimize,
info.get("streamtype", 0), info.get("streamtype", 0),
dpi[0], dpi[1], dpi[0], dpi[1],
subsampling, subsampling,
@ -707,7 +709,7 @@ def _save(im, fp, filename):
# channels*size, this is a value that's been used in a django patch. # channels*size, this is a value that's been used in a django patch.
# https://github.com/matthewwithanm/django-imagekit/issues/50 # https://github.com/matthewwithanm/django-imagekit/issues/50
bufsize = 0 bufsize = 0
if "optimize" in info or progressive: if optimize or progressive:
# keep sets quality to 0, but the actual value may be high. # keep sets quality to 0, but the actual value may be high.
if quality >= 95 or quality == 0: if quality >= 95 or quality == 0:
bufsize = 2 * im.size[0] * im.size[1] bufsize = 2 * im.size[0] * im.size[1]

View File

@ -696,15 +696,10 @@ def _save(im, fp, filename, chunk=putchunk, check=0):
mode = "%s;%d" % (mode, bits) mode = "%s;%d" % (mode, bits)
# encoder options # encoder options
if "dictionary" in im.encoderinfo: im.encoderconfig = (im.encoderinfo.get("optimize", False),
dictionary = im.encoderinfo["dictionary"]
else:
dictionary = b""
im.encoderconfig = ("optimize" in im.encoderinfo,
im.encoderinfo.get("compress_level", -1), im.encoderinfo.get("compress_level", -1),
im.encoderinfo.get("compress_type", -1), im.encoderinfo.get("compress_type", -1),
dictionary) im.encoderinfo.get("dictionary", b""))
# get the corresponding PNG mode # get the corresponding PNG mode
try: try:

View File

@ -126,9 +126,12 @@ class TestFileJpeg(PillowTestCase):
def test_optimize(self): def test_optimize(self):
im1 = self.roundtrip(hopper()) im1 = self.roundtrip(hopper())
im2 = self.roundtrip(hopper(), optimize=1) im2 = self.roundtrip(hopper(), optimize=0)
im3 = self.roundtrip(hopper(), optimize=1)
self.assert_image_equal(im1, im2) self.assert_image_equal(im1, im2)
self.assert_image_equal(im1, im3)
self.assertGreaterEqual(im1.bytes, im2.bytes) self.assertGreaterEqual(im1.bytes, im2.bytes)
self.assertGreaterEqual(im1.bytes, im3.bytes)
def test_optimize_large_buffer(self): def test_optimize_large_buffer(self):
# https://github.com/python-pillow/Pillow/issues/148 # https://github.com/python-pillow/Pillow/issues/148
@ -139,9 +142,14 @@ class TestFileJpeg(PillowTestCase):
def test_progressive(self): def test_progressive(self):
im1 = self.roundtrip(hopper()) im1 = self.roundtrip(hopper())
im2 = self.roundtrip(hopper(), progressive=True) im2 = self.roundtrip(hopper(), progressive=False)
self.assert_image_equal(im1, im2) im3 = self.roundtrip(hopper(), progressive=True)
self.assertGreaterEqual(im1.bytes, im2.bytes) self.assertFalse(im1.info.get("progressive"))
self.assertFalse(im2.info.get("progressive"))
self.assertTrue(im3.info.get("progressive"))
self.assert_image_equal(im1, im3)
self.assertGreaterEqual(im1.bytes, im3.bytes)
def test_progressive_large_buffer(self): def test_progressive_large_buffer(self):
f = self.tempfile('temp.jpg') f = self.tempfile('temp.jpg')

View File

@ -219,20 +219,20 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options:
image quality. image quality.
**optimize** **optimize**
If present, indicates that the encoder should make an extra pass over the If present and true, indicates that the encoder should make an extra pass
image in order to select optimal encoder settings. over the image in order to select optimal encoder settings.
**progressive** **progressive**
If present, indicates that this image should be stored as a progressive If present and true, indicates that this image should be stored as a
JPEG file. progressive JPEG file.
**dpi** **dpi**
A tuple of integers representing the pixel density, ``(x,y)``. A tuple of integers representing the pixel density, ``(x,y)``.
**icc_profile** **icc_profile**
If present, the image is stored with the provided ICC profile. If If present and true, the image is stored with the provided ICC profile.
this parameter is not provided, the image will be saved with no If this parameter is not provided, the image will be saved with no profile
profile attached. To preserve the existing profile:: attached. To preserve the existing profile::
im.save(filename, 'jpeg', icc_profile=im.info.get('icc_profile')) im.save(filename, 'jpeg', icc_profile=im.info.get('icc_profile'))
@ -399,9 +399,9 @@ chunks is limited to ``PngImagePlugin.MAX_TEXT_MEMORY``, defaulting to
The :py:meth:`~PIL.Image.Image.save` method supports the following options: The :py:meth:`~PIL.Image.Image.save` method supports the following options:
**optimize** **optimize**
If present, instructs the PNG writer to make the output file as small as If present and true, instructs the PNG writer to make the output file as
possible. This includes extra processing in order to find optimal encoder small as possible. This includes extra processing in order to find optimal
settings. encoder settings.
**transparency** **transparency**
For ``P``, ``L``, and ``RGB`` images, this option controls what For ``P``, ``L``, and ``RGB`` images, this option controls what
@ -615,8 +615,7 @@ format are currently undocumented.
The :py:meth:`~PIL.Image.Image.save` method supports the following options: The :py:meth:`~PIL.Image.Image.save` method supports the following options:
**lossless** **lossless**
If present, instructs the WEBP writer to use lossless If present and true, instructs the WEBP writer to use lossless compression.
compression.
**quality** **quality**
Integer, 1-100, Defaults to 80. Sets the quality level for Integer, 1-100, Defaults to 80. Sets the quality level for