diff --git a/CHANGES.rst b/CHANGES.rst index b3838b562..8b3f16ab0 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,12 +1,18 @@ Changelog (Pillow) ================== -2.4.0 (2014-04-01 est.) +2.4.0 (unreleased) ------------------ - Fixed opening and saving odd sized .pcx files [wiredfool] +- Fixed saving mode P image as a PNG with transparency = palette color 0 + [d-schmidt] + +- Improve heuristic used when saving progressive and optimized JPEGs with high quality values + [e98cuenc] + - Fixed DOS with invalid palette size or invalid image size in BMP file [wiredfool] diff --git a/PIL/Image.py b/PIL/Image.py index e71e2ad5f..b93ce24a4 100644 --- a/PIL/Image.py +++ b/PIL/Image.py @@ -1098,7 +1098,6 @@ class Image: third, the box defaults to (0, 0), and the second argument is interpreted as a mask image. :param mask: An optional mask image. - :returns: An :py:class:`~PIL.Image.Image` object. """ if isImageType(box) and mask is None: diff --git a/PIL/JpegImagePlugin.py b/PIL/JpegImagePlugin.py index 90d3b5194..9563f9723 100644 --- a/PIL/JpegImagePlugin.py +++ b/PIL/JpegImagePlugin.py @@ -566,7 +566,10 @@ def _save(im, fp, filename): # https://github.com/jdriscoll/django-imagekit/issues/50 bufsize=0 if "optimize" in info or "progressive" in info or "progression" in info: - bufsize = im.size[0]*im.size[1] + if quality >= 95: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] # The exif info needs to be written as one block, + APP1, + one spare byte. # Ensure that our buffer is big enough diff --git a/PIL/PngImagePlugin.py b/PIL/PngImagePlugin.py index a6038d9f2..18abf27d3 100644 --- a/PIL/PngImagePlugin.py +++ b/PIL/PngImagePlugin.py @@ -561,7 +561,7 @@ def _save(im, fp, filename, chunk=putchunk, check=0): transparency = im.encoderinfo.get('transparency',im.info.get('transparency', None)) - if transparency: + if transparency or transparency == 0: if im.mode == "P": # limit to actual palette size alpha_bytes = 2**bits diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index de1c3f0e1..07a7c9f96 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1,5 +1,7 @@ from tester import * +import random + from PIL import Image from PIL import ImageFile @@ -132,13 +134,23 @@ def test_progressive_large_buffer(): im = Image.new("RGB", (4096,4096), 0xff3333) im.save(f, format="JPEG", progressive=True) +def test_progressive_large_buffer_highest_quality(): + f = tempfile('temp.jpg') + if py3: + a = bytes(random.randint(0, 255) for _ in range(256 * 256 * 3)) + else: + a = b''.join(chr(random.randint(0, 255)) for _ in range(256 * 256 * 3)) + im = Image.frombuffer("RGB", (256, 256), a, "raw", "RGB", 0, 1) + # this requires more bytes than pixels in the image + im.save(f, format="JPEG", progressive=True, quality=100) + def test_large_exif(): #https://github.com/python-imaging/Pillow/issues/148 f = tempfile('temp.jpg') im = lena() im.save(f,'JPEG', quality=90, exif=b"1"*65532) -def test_progressive(): +def test_progressive_compat(): im1 = roundtrip(lena()) im2 = roundtrip(lena(), progressive=1) im3 = roundtrip(lena(), progression=1) # compatibility diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index e8d2a1208..c17829194 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -251,6 +251,20 @@ def test_trns_rgb(): im = roundtrip(im, transparency=(0, 1, 2)) assert_equal(im.info["transparency"], (0, 1, 2)) +def test_trns_p(): + # Check writing a transparency of 0, issue #528 + im = lena('P') + im.info['transparency']=0 + + f = tempfile("temp.png") + im.save(f) + + im2 = Image.open(f) + assert_true('transparency' in im2.info) + + assert_image_equal(im2.convert('RGBA'), im.convert('RGBA')) + + def test_save_icc_profile_none(): # check saving files with an ICC profile set to None (omit profile) in_file = "Tests/images/icc_profile_none.png" diff --git a/docs/about.rst b/docs/about.rst index dfd88b605..b6ae2eaf9 100644 --- a/docs/about.rst +++ b/docs/about.rst @@ -16,6 +16,24 @@ The fork authors' goal is to foster active development of PIL through: .. _Python Package Index: https://pypi.python.org/pypi/Pillow .. _Image-SIG: http://mail.python.org/mailman/listinfo/image-sig +License +------- + +like PIL itself, Pillow is licensed under the MIT-like `PIL Software License `:: + + Software License + + The Python Imaging Library (PIL) is + + Copyright © 1997-2011 by Secret Labs AB + Copyright © 1995-2011 by Fredrik Lundh + + By obtaining, using, and/or copying this software and/or its associated documentation, you agree that you have read, understood, and will comply with the following terms and conditions: + + Permission to use, copy, modify, and distribute this software and its associated documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appears in all copies, and that both that copyright notice and this permission notice appear in supporting documentation, and that the name of Secret Labs AB or the author not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission. + + SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + Why a fork? ----------- @@ -26,8 +44,8 @@ issues reported. .. _this Image-SIG post: https://mail.python.org/pipermail/image-sig/2010-August/006480.html -What about the official PIL? ----------------------------- +What about PIL? +--------------- .. note::