NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #59 most downloaded on PyPI
Python Imaging Library (fork)
Last release 3 months ago
01 Jul 2026
Ships on a steady schedule
a new release about every 3 months
Nearly every release is documented
notes for 60 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
16 years old
107 releases · first in 2010
Setup: Replace deprecated platform.dist with file existence check #2869 [wiredfool]
Docs: Added docstrings from documentation #2914 [radarhere]
Test: Switch from nose to pytest #2815 [hugovk]
Rework Source directory layout, preventing accidental import of PIL. #2911 [wiredfool]
Dynamically link libraqm #2753 [wiredfool]
Removed scripts directory #2901 [wiredfool]
TIFF: Run all compressed tiffs through libtiff decoder #2899 [wiredfool]
GIF: Add disposal option when saving GIFs #2902 [linnil1, wiredfool]
EPS: Allow for an empty line in EPS header data #2903 [radarhere]
PNG: Add support for sRGB and cHRM chunks, permit sRGB when no iCCP chunk present #2898 [wiredfool]
Dependencies: Update Tk Tcl to 8.6.8 #2905 [radarhere]
Decompression bomb error now raised for images 2x larger than a decompression bomb warning #2583 [wiredfool]
Test: avoid random failure in test_effect_noise #2894 [hugovk]
Increased epsilon for test_file_eps.py:test_showpage due to Arch update. #2896 [wiredfool]
Removed check parameter from _save in BmpImagePlugin, PngImagePlugin, ImImagePlugin, PalmImagePlugin, and PcxImagePlugin. #2873 [radarhere]
Make PngImagePlugin.add_text() zip argument type bool #2890 [jdufresne]
Depends: Updated libwebp to 0.6.1 #2880 [radarhere]
Remove unnecessary bool() calls in Image.registered_extensions and skipKnownBadTests #2891 [jdufresne]
Fix count of BITSPERSAMPLE items in broken TIFF files #2883 [homm]
Fillcolor parameter for Image.Transform #2852 [wiredfool]
Test: Display differences for test failures #2862 [wiredfool]
Added executable flag to file with shebang line #2884 [radarhere]
Setup: Specify compatible Python versions for pip #2877 [hugovk]
Dependencies: Updated libimagequant to 2.11.4 #2878 [radarhere]
Setup: Warn if trying to install for Py3.7 on Windows #2855 [hugovk]
Doc: Fonts can be loaded from a file-like object, not just filename #2861 [robin-norwood]
Add eog support for Ubuntu Image Viewer #2864 [NafisFaysal]
Test: Test on 3.7-dev on Travis CI #2870 [hugovk]
Dependencies: Update libtiff to 4.0.9 #2871 [radarhere]
Setup: Replace deprecated platform.dist with file existence check #2869 [wiredfool]
Build: Fix setup.py on Debian #2853 [wiredfool]
Docs: Correct error in ImageDraw documentation #2858 [meribold]
Test: Drop Ubuntu Precise, Fedora 24, Fedora 25, add Fedora 27, Centos 7, Amazon v2 CI Support #2854, #2843, #2895, #2897 [wiredfool]
Dependencies: Updated libimagequant to 2.11.3 #2849 [radarhere]
Test: Fix test_image.py to use tempfile #2841 [radarhere]
Replace PIL.OleFileIO deprecation warning with descriptive ImportError #2833 [hugovk]
WebP: Add support for animated WebP files #2761 [jd20]
PDF: Set encoderinfo for images when saving multi-page PDF. Fixes #2804. #2805 [ixio]
Allow the olefile dependency to be optional #2789 [jdufresne]
GIF: Permit LZW code lengths up to 12 bits in GIF decode #2813 [wiredfool]
Fix unterminated string and unchecked exception in _font_text_asBytes. #2825 [wiredfool]
PPM: Use fixed list of whitespace, rather relying on locale, fixes #272. #2831 [markmiscavage]
Added support for generators when using append_images #2829, #2835 [radarhere]
Doc: Correct PixelAccess.rst #2824 [hasahmed]
Depends: Update raqm to 0.3.0 #2822 [radarhere]
Docs: Link to maintained version of aggdraw #2809 [hugovk]
Include license file in the generated wheel packages #2801 [jdufresne]
Depends: Update openjpeg to 2.3.0 #2791 [radarhere]
Add option to Makefile to build and install with C coverage #2781 [hugovk]
Add context manager support to ImageFile.Parser and PngImagePlugin.ChunkStream #2793 [radarhere]
ImageDraw.textsize: fix zero length error #2788 [wiredfool, hugovk]
One column per quarter.
Python 3.3 is EOL and no longer supported due to moving testing from nose, which is deprecated, to pytest, which doesn't support Python 3.3. We will not be creating binaries, testing, or retaining compatibility with this version. The final version of Pillow for Python 3.3 is 4.3.0.
Pillow has previously emitted warnings for images that are unexpectedly large and may be a denial of service. These warnings are now upgraded to DecompressionBombErrors for images that are twice the size of images that trigger the DecompressionBombWarning. The default threshold is 128Mpx, or 0.5GB for an RGB or RGBA image. This can be disabled or changed by setting Image.MAX_IMAGE_PIXELS = None.
The scripts formerly installed by Pillow have been split into a separate package, pillow-scripts, living at https://github.com/python-pillow/pillow-scripts.
The olefile module is no longer a required dependency when installing Pillow. Support for plugins requiring olefile will not be loaded if it is not installed. This allows library consumers to avoid installing this dependency if they choose. Some library consumers have little interest in the format support and would like to keep dependencies to a minimum.
Further, the vendored version was removed in Pillow 4.0.0 and replaced with a deprecation warning that PIL.OleFileIO would be removed in a future version. This warning has been upgraded to an import error pending future removal.
Several image plugins supported a named check parameter on their nominally private _save method to preflight if the image could be saved in that format. That parameter has been removed.
A new named parameter, fillcolor, has been added to Image.transform. This color specifies the background color to use in the area outside the transformed area in the output image. This parameter takes the same color specifications as used in Image.new.
Multiframe GIF images now take an optional disposal parameter to specify the disposal option for changed pixels.
Previously, there were some compression modes (JPEG, Packbits, and LZW) that were supported with Pillow's internal TIFF decoder. All compressed TIFFs are now read using the libtiff decoder, as it implements the compression schemes more correctly.
The libraqm dependency for complex text scripts is now linked dynamically at runtime rather than at packaging time. This allows us to release binaries with support for libraqm if it is installed on the user's machine.
The Pillow source is now stored within the src directory of the distribution. This prevents accidental imports of the PIL directory when running Python from the project directory.
Multiarch support on Linux should be more robust, especially on Debian derivatives on ARM platforms. Debian's multiarch platform configuration is run in preference to the sniffing of machine platform and architecture.
Deprecate ImageOps undocumented functions gaussian_blur, gblur, unsharp_mask, usm and box_blur in favor of ImageFilter implementations #2735 [homm]
Fix warning on pointer cast in isblock #2775, #2778 [cgohlke]
Doc: Added macOS High Sierra tested Pillow version #2777 [radarhere]
Use correct Windows handle type on 64 bit in imagingcms #2774 [cgohlke]
64 Bit Windows fix for block storage #2773 [cgohlke]
Fix "expression result unused" warning #2764 [radarhere]
Add 16bit Read/Write and RLE read support to SgiImageFile #2769 [jbltx, wiredfool]
Block & array hybrid storage #2738 [homm]
Common seek frame position check #1849 [radarhere]
Doc: Add note about aspect ratio to Image thumbnail script #2281 [wilsonge]
Fix ValueError: invalid version number '1.0.0rc1' in scipy release candidate #2771 [cgohlke]
Unfreeze requirements.txt #2766 [hugovk]
Test: ResourceWarning tests #2756 [hugovk]
Use n_frames to determine is_animated if possible #2315 [radarhere]
Doc: Corrected parameters in documentation #2768 [radarhere]
Avoid unnecessary Image operations #1891 [radarhere]
Added register_extensions method #1860 [radarhere]
Fix TIFF support for I;16S, I;16BS, and I;32BS rawmodes #2748 [wiredfool]
Fixed doc syntax in ImageDraw #2752 [radarhere]
Fixed support for building on Windows/msys2. Added Appveyor CI coverage for python3 on msys2 #2746 [wiredfool]
Fix ValueError in Exif/Tiff IFD #2719 [wiredfool]
Use pathlib2 for Path objects on Python < 3.4 #2291 [asergi]
Export only required properties in unsafe_ptrs #2740 [homm]
Alpha composite fixes #2709 [homm]
Faster Transpose operations, added 'Transverse' option #2730 [homm]
Deprecate ImageOps undocumented functions gaussian_blur, gblur, unsharp_mask, usm and box_blur in favor of ImageFilter implementations #2735 [homm]
Dependencies: Updated freetype to 2.8.1 #2741 [radarhere]
Bug: Player skipped first image #2742 [radarhere]
Faster filter operations for Kernel, Gaussian, and Unsharp Mask filters #2679 [homm]
EPS: Add showpage to force rendering of some EPS images #2636 [kaplun]
DOC: Fix type of palette parameter in Image.quantize. #2703 [kkopachev]
DOC: Fix Ico docs to match code #2712 [hugovk]
Added file pointer save to SpiderImagePlugin #2647 [radarhere]
Add targa version 2 footer #2713 [jhultgre]
Removed redundant lines #2714 [radarhere]
Travis CI: Use default pypy/pypy3 #2721 [hugovk]
Fix for SystemError when rendering an empty string, added in 4.2.0 #2706 [wiredfool]
Fix for memory leaks in font handling added in 4.2.0 #2634 [wiredfool]
Tests: cleanup, more tests. Fixed WMF save handler #2689 [radarhere]
Removed debugging interface for Image.core.grabclipboard #2708 [radarhere]
Doc syntax fix #2710 [radarhere]
Faster packing and unpacking for RGB, LA, and related storage modes #2693 [homm]
Use RGBX rawmode for RGB JPEG images where possible #1989 [homm]
Remove palettes from non-palette modes in _new #2704 [wiredfool]
Delete transparency info when convert'ing RGB/L to RGBA #2633 [olt]
Code tweaks to ease type annotations #2687 [neiljp]
Fixed incorrect use of 's#' to byteslike object #2691 [wiredfool]
Fix JPEG subsampling labels for subsampling=2 #2698 [homm]
Region of interest (box) for resampling #2254 [homm]
Basic support for Termux (android) in setup.py #2684 [wiredfool]
Bug: Fix Image.fromarray for numpy.bool type. #2683 [wiredfool]
CI: Add Fedora 24 and 26 to Docker tests [wiredfool]
JPEG: Fix ZeroDivisionError when EXIF contains invalid DPI (0/0). #2667 [vytisb]
Depends: Updated openjpeg to 2.2.0 #2669 [radarhere]
Depends: Updated Tk Tcl to 8.6.7 #2668 [radarhere]
Depends: Updated libimagequant to 2.10.2 #2660 [radarhere]
Test: Added test for ImImagePlugin tell() #2675 [radarhere]
Test: Additional tests for SGIImagePlugin #2659 [radarhere]
New Image.getchannel method #2661 [homm]
Remove unused im.copy2 and core.copy methods #2657 [homm]
Fast Image.merge() #2677 [homm]
Fast Image.split() #2676 [homm]
Fast image allocation #2655 [homm]
Storage cleanup #2654 [homm]
FLI: Use frame count from FLI header #2674 [radarhere]
Test: Test animated FLI file #2650 [hugovk]
Bug: Fixed uninitialized memory in bc5 decoding #2648 [ifeherva]
Moved SgiImagePlugin save error to before the start of write operations #2646 [radarhere]
Move createfontdatachunk.py so isn't installed globally #2645 [hugovk]
Bug: Fix unexpected keyword argument 'align' #2641 [hugovk]
Add newlines to error message for clarity #2640 [hugovk]
Docs: Updated redirected URL #2637 [radarhere]
Bug: Fix JPEG DPI when EXIF is invalid #2632 [wiredfool]
Bug: Fix for font getsize on empty string #2624 [radarhere]
Docs: Improved ImageDraw documentation #2626 [radarhere]
Docs: Corrected alpha_composite args documentation #2627 [radarhere]
Docs: added the description of the filename attribute to images.rst #2621 [dasdachs]
Dependencies: Updated libimagequant to 2.10.1 #2616 [radarhere]
PDF: Renamed parameter to not shadow built-in dict #2612 [kijeong]
Several undocumented functions in ImageOps have been deprecated: gaussian_blur, gblur, unsharp_mask, usm and box_blur. Use the equivalent operations in ImageFilter instead. These functions will be removed in a future release.
TIFF tags with unknown type/quantity now default to being bare values if they are 1 element, where previously they would be a single element tuple. This is only with the new api, not the legacy api. This normalizes the handling of fields, so that the metadata with inferred or image specified counts are handled the same as metadata with count specified in the TIFF spec.
The PhotoshopInfo, XMP, and JPEGTables tags now have a defined type (bytes) and a count of 1.
The ImageJMetaDataByteCounts tag now has an arbitrary number of items, as there can be multiple items, one for UTF-8, and one for UTF-16.
These are internal functions that should not have been used by user code, but they were accessible from the python layer.
Debugging code within Image.core.grabclipboard was removed. It had been marked as will be removed in future versions since PIL. When enabled, it identified the format of the clipboard data.
The PIL.Image.core.copy and PIL.Image.Image.im.copy2 methods have been removed.
The PIL.Image.core.getcount methods have been removed, use PIL.Image.core.get_stats()['new_count'] property instead.
A new method PIL.Image.Image.getchannel has been added to return a single channel by index or name. For example, image.getchannel("A") will return alpha channel as separate image. getchannel should work up to 6 times faster than image.split()[0] in previous Pillow versions.
A new filter, PIL.ImageFilter.BoxBlur, has been added. This is a filter with similar results to a Gaussian blur, but is much faster.
Added new argument box for PIL.Image.Image.resize. This argument defines a source rectangle from within the source image to be resized. This is very similar to the image.crop(box).resize(size) sequence except that box can be specified with subpixel accuracy.
The Image.TRANSVERSE operation has been added to PIL.Image.Image.transpose. This is equivalent to a transpose operation about the opposite diagonal.
There is a new PIL.ImageFilter.MultibandFilter base class for image filters that can run on all channels of an image in one operation. The original PIL.ImageFilter.Filter class remains for image filters that can process only single band images, or require splitting of channels prior to filtering.
Pillow now can read 16-bit multichannel TIFF files including files with alpha transparency. The image data is truncated to 8-bit precision.
Pillow now can read 16-bit signed integer single channel TIFF files. The image data is promoted to 32-bit for storage and processing.
Pillow can now read and write uncompressed 16-bit multichannel SGI images to and from RGB and RGBA formats. The image data is truncated to 8-bit precision.
Pillow can now read RLE encoded SGI images in both 8 and 16-bit precision.
This release contains several performance improvements:
Many memory bandwidth-bounded operations such as crop, image allocation, conversion, split into bands and merging from bands are up to 2x faster.
Upscaling of multichannel images (such as RGB) is accelerated by 5-10%
JPEG loading is accelerated up to 15% and JPEG saving up to 20% when using a recent version of libjpeg-turbo.
Image.transpose has been accelerated 15% or more by using a cache friendly algorithm.
ImageFilters based on Kernel convolution are significantly faster due to the new ~PIL.ImageFilter.MultibandFilter feature.
All memory allocation for images is now done in blocks, rather than falling back to an allocation for each scan line for images larger than the block size.
The basic CMYK->RGB conversion has been tweaked to match the formula from Google Chrome. This produces an image that is generally lighter than the previous formula, and more in line with what color managed applications produce.
CI: Fix version specification and test on CI for PyPy/Windows #2608 [wiredfool]
CI: Fix version specification and test on CI for PyPy/Windows #2608 [wiredfool]
There are no functional changes in this release.
A change in the 4.2.0 cycle broke the Windows PyPy build. This has been fixed, and PyPy is now part of the Windows CI matrix.
Remove deprecated code #2549 [hugovk]
Doc: Clarified Image.save:append_images documentation #2604 [radarhere]
CI: Amazon Linux and Centos6 docker images added to Travis CI #2585 [wiredfool]
Image.alpha_composite added #2595 [wiredfool]
Complex Text Support #2576 [ShamsaHamed, Fahad-Alsaidi, wiredfool]
Added threshold parameter to ImageDraw.floodfill #2599 [nediamond]
Added dBATCH parameter to ghostscript command #2588 [radarhere]
JPEG: Adjust buffer size when icc_profile > MAXBLOCK #2596 [Darou]
Specify Pillow Version in one place #2517 [wiredfool]
CI: Change the owner of the TRAVIS_BUILD_DIR, fixing broken docker runs #2587 [wiredfool]
Fix truncated PNG loading for some images, Fix memory leak on truncated PNG images. #2541, #2598 [homm]
Add decompression bomb check to Image.crop #2410 [wiredfool]
ImageFile: Ensure that the err_code variable is initialized in case of exception. #2363 [alexkiro]
Tiff: Support append_images for saving multipage TIFFs #2406 [blochl]
Doc: Clarify that draft is only implemented for JPEG and PCD #2409 [wiredfool]
Test: MicImagePlugin #2447 [hugovk]
Use round() instead of floor() to eliminate zero coefficients in resample #2558 [homm]
Remove deprecated code #2549 [hugovk]
Added append_images to PDF saving #2526 [radarhere]
Remove unused function core image function new_array #2548 [hugovk]
Remove unnecessary calls to dict.keys() #2551 [jdufresne]
Add more ImageDraw.py tests and remove unused Draw.c code #2533 [hugovk]
Test: More tests for ImageMorph #2554 [hugovk]
Test: McIDAS area file #2552 [radarhere]
Update Feature Detection #2520 [wiredfool]
CI: Update pypy on Travis CI #2573 [hugovk]
ImageMorph: Fix wrong expected size of MRLs read from disk #2561 [dov]
Docs: Update install docs for FreeBSD #2546 [wiredfool]
Build: Ignore OpenJpeg 1.5 on FreeBSD #2544 [melvyn-sopacua]
Remove 'not yet implemented' methods from PIL 1.1.4 #2538 [hugovk]
Dependencies: Update FreeType to 2.8, LibTIFF to 4.0.8 and libimagequant to 2.9.1 #2535 #2537 #2540 [radarhere]
Raise TypeError and not also UnboundLocalError in ImageFile.Parser() #2525 [joshblum]
Test: Use Codecov for coverage #2528 [hugovk]
Use PNG for Image.show() #2527 [HinTak, wiredfool]
Remove WITH_DEBUG compilation flag #2522 [wiredfool]
Fix return value on parameter parse error in _webp.c #2521 [adw1n]
Set executable flag on scripts with shebang line #2295 [radarhere]
Flake8 #2460 [radarhere]
Doc: Release Process Changes #2516 [wiredfool]
CI: Added region for s3 deployment on appveyor #2515 [wiredfool]
Doc: Updated references to point to existing files #2507 [radarhere]
Return copy on Image crop if crop dimensions match the image #2471 [radarhere]
Test: Optimize CI speed #2464, #2466 [hugovk]
The methods PIL.ImageWin.Dib.fromstring, PIL.ImageWin.Dib.tostring and PIL.TiffImagePlugin.ImageFileDirectory_v2.as_dict have been removed.
Before Pillow 4.2.0, attempting to save an RGBA image as JPEG would discard the alpha channel. From Pillow 3.4.0, a deprecation warning was shown. From Pillow 4.2.0, the deprecation warning is removed and an IOError is raised.
The unused function Image.core.new_array was removed. This is an internal function that should not have been used by user code, but it was accessible from the python layer.
Pillow now supports complex text rendering for scripts requiring glyph composition and bidirectional flow. This optional feature adds three dependencies: harfbuzz, fribidi, and raqm. See the install documentation for further details. This feature is tested and works on Unix and Mac, but has not yet been built on Windows platforms.
PIL.ImageDraw.floodfill has a new optional parameter: threshold. This specifies a tolerance for the color to replace with the flood fill.
The TIFF and PDF image writers now support the append_images optional parameter for specifying additional images to create multipage outputs.
PIL.Image.Image.crop now may raise a DecompressionBomb warning if the crop region enlarges the image over the threshold specified by PIL.Image.MAX_IMAGE_PIXELS.
Undef PySlice_GetIndicesEx, see https://bugs.python.org/issue29943 #2493 [cgohlke]
Undef PySlice_GetIndicesEx, see https://bugs.python.org/issue29943 #2493 [cgohlke]
Fix for file with DPI in EXIF but not metadata, and XResolution is an int rather than tuple #2484 [hugovk]
Docs: Removed broken download counter badge #2487 [hugovk]
Docs: Fixed rst syntax error #2477 [thebjorn]
Some JPEG images don't contain DPI information in the image metadata, but do contain it in the EXIF data. A patch was added in 4.1.0 to read from the EXIF data, but it did not accept all possible types that could be included there. This fix adds the ability to read ints as well as rational values.
CPython 3.6.1 added a new symbol, PySlice_GetIndicesEx, which was not present in 3.6.0. This had the effect of causing binaries compiled on CPython 3.6.1 to not work on installations of C-Python 3.6.0. This fix undefines PySlice_GetIndicesEx if it exists to restore compatibility with both 3.6.0 and 3.6.1. See https://bugs.python.org/issue29943 for more details.
Removed use of spaces in TIFF kwargs names, deprecated in 2.7 #1390 [radarhere]
Close files after loading if possible #2330 [homm, wiredfool]
Fix Image Access to be reloadable when embedding the Python interpreter #2296 [wiredfool, cgohlke]
Fetch DPI from EXIF if not specified in JPEG header #2449, #2472 [hugovk]
Removed winbuild checksum verification #2468 [radarhere]
Git: Set ContainerIO test file as binary #2469 [cgohlke]
Remove superfluous import of FixTk #2455 [cgohlke)
Fix import of tkinter/Tkinter #2456 [cgohlke)
Pure Python Decoders, including Python decoder to fix for MSP images #1938 [wiredfool, hugovk]
Reorganized GifImagePlugin, fixes #2314. #2374 [radarhere, wiredfool]
Doc: Reordered operating systems in Compatibility Matrix #2436 [radarhere]
Test: Additional tests for BufrStub, Eps, Container, GribStub, IPTC, Wmf, XVThumb, ImageDraw, ImageMorph, ImageShow #2425 [radarhere]
Health fixes #2437 [radarhere]
Test: Correctness tests ContainerIO, XVThumbImagePlugin, BufrStubImagePlugin, GribStubImagePlugin, FitsStubImagePlugin, Hdf5StubImagePlugin, PixarImageFile, PsdImageFile #2443, #2442, #2441, #2440, #2431, #2430, #2428, #2427 [hugovk]
Remove unused imports #1822 [radarhere]
Replaced KeyError catch with dictionary get method #2424 [radarhere]
Test: Removed unrunnable code in test_image_toqimage #2415 [hugovk]
Removed use of spaces in TIFF kwargs names, deprecated in 2.7 #1390 [radarhere]
Removed deprecated ImageDraw setink, setfill, setfont methods #2220 [jdufresne]
Send unwanted subprocess output to /dev/null #2253 [jdufresne]
Fix division by zero when creating 0x0 image from numpy array #2419 [hugovk]
Test: Added matrix convert tests #2381 [hugovk]
Replaced broken URL to partners.adobe.com #2413 [radarhere]
Removed unused private functions in setup.py and build_dep.py #2414 [radarhere]
Test: Fixed Qt tests for QT5 and saving 1 bit PNG #2394 [wiredfool]
Test: docker builds for Arch and Debian Stretch #2394 [wiredfool]
Updated libwebp to 0.6.0 on appveyor #2395 [radarhere]
More explicit error message when saving to a file with invalid extension #2399 [ces42]
Docs: Update some http urls to https #2403 [hugovk]
Preserve aux/alpha channels when performing Imagecms transforms #2355 [gunjambi]
Test linear and radial gradient effects #2382 [hugovk]
Test ImageDraw.Outline and and ImageDraw.Shape #2389 [hugovk]
Added PySide to ImageQt documentation #2392 [radarhere]
BUG: Empty image mode no longer causes a crash #2380 [evalapply]
Exclude .travis and contents from manifest #2386 [radarhere]
Remove 'MIT-like' from license #2145 [wiredfool]
Tests: Add tests for several Image operations #2379 [radarhere]
PNG: Moved iCCP chunk before PLTE chunk when saving as PNG, restricted chunks known value/ordering #2347 [radarhere]
Default to inch-interpretation for missing ResolutionUnit in TiffImagePlugin #2365 [lambdafu]
Bug: Fixed segfault when using ImagingTk on pypy Issue #2376, #2359. [wiredfool]
Bug: Fixed Integer overflow using ImagingTk on 32 bit platforms #2359 [wiredfool, QuLogic]
Tests: Added docker images for testing alternate platforms. See also https://github.com/python-pillow/docker-images. #2368 [wiredfool]
Removed PIL 1.0 era TK readme that concerns Windows 95/NT #2360 [wiredfool]
Prevent nose -v printing docstrings #2369 [hugovk]
Replaced absolute PIL imports with relative imports #2349 [radarhere]
Added context managers for file handling #2307 [radarhere]
Expose registered file extensions in Image #2343 [iggomez, radarhere]
Make mode descriptor cache initialization thread-safe. #2351 [gunjambi]
Updated Windows test dependencies: Freetype 2.7.1, zlib 1.2.11 #2331, #2332, #2357 [radarhere]
Followed upstream pngquant packaging reorg to libimagquant #2354 [radarhere]
Fix invalid string escapes #2352 [hugovk]
Add test for crop operation with no argument #2333 [radarhere]
Several deprecated items have been removed.
Support for spaces in tiff kwargs in the parameters for 'x resolution', 'y resolution', 'resolution unit', and 'date time' has been removed. Underscores should be used instead.
The methods PIL.ImageDraw.ImageDraw.setink, PIL.ImageDraw.ImageDraw.setfill, and PIL.ImageDraw.ImageDraw.setfont have been removed.
The file handling when opening images has been overhauled. Previously, Pillow would attempt to close some, but not all image formats after loading the image data. Now, the following behavior is specified:
For images where an open file is passed in, it is the responsibility of the calling code to close the file.
For images where Pillow opens the file and the file is known to have only one frame, the file is closed after loading.
If the file has more than one frame, or if it can't be determined, then the file is left open to permit seeking to subsequent frames. It will be closed, eventually, in the close or __del__ methods.
If the image is memory mapped, then we can't close the mapping to the underlying file until we are done with the image. The mapping will be closed in the close or __del__ method.
The PIL.GifImagePlugin code has been refactored to fix the flow when saving images. There are two external changes that arise from this:
An PIL.ImagePalette.ImagePalette object is now accepted as a specified palette argument in PIL.Image.Image.save().
The image to be saved is no longer modified in place by any of the operations of the save function. Previously it was modified when optimizing the image palette.
This refactor fixed some bugs with palette handling when saving multiple frame GIFs.
The method PIL.Image.Image.remap_palette() has been added. This method was hoisted from the GifImagePlugin code used to optimize the palette.
There is now a decoder registry similar to the image plugin registries. Image plugins can register a decoder, and it will be called when the decoding is requested. This allows for the creation of pure Python decoders. While the Python decoders will not be as fast as their C based counterparts, they may be easier and quicker to develop or safer to run.
Many tests have been added, including correctness tests for image formats that have been previously untested.
We are now running automated tests in Docker containers against more Linux versions than are provided on Travis CI, which is currently Ubuntu 14.04 x64. This Pillow release is tested on 64-bit Alpine, Arch, Ubuntu 12.04 and 16.04, and 32-bit Debian Stretch and Ubuntu 14.04. This also covers a wider range of dependency versions than are provided on Travis natively.
Removed deprecated internal "stretch" method #2276 [homm]
Refactor out postprocessing hack to load_end in PcdImageFile [wiredfool]
Add center and translate option to Image.rotate. #2328 [lambdafu]
Test: Relax WMF test condition, fixes #2323. #2327 [wiredfool]
Allow 0 size images, Fixes #2259, Reverts to pre-3.4 behavior. #2262 [wiredfool]
SGI: Save uncompressed SGI/BW/RGB/RGBA files #2325 [jbltx]
Depends: Updated pngquant to 2.8.2 #2319 [radarhere]
Test: Added correctness tests for opening SGI images #2324 [wiredfool]
Allow passing a list or tuple of individual frame durations when saving a GIF #2298 [Xdynix]
Unified different GIF optimize conditions #2196 [radarhere]
Build: Refactor dependency installation #2305 [hugovk]
Test: Add python 3.6 to travis, tox #2304 [hugovk]
Test: Fix coveralls coverage for Python+C #2300 [hugovk]
Remove executable bit and shebang from OleFileIO.py #2308 [jwilk, radarhere]
PyPy: Buffer interface workaround #2294 [wiredfool]
Test: Switch to Ubuntu Trusty 14.04 on Travis CI #2294
Remove vendored version of olefile Python package in favor of upstream #2199 [jdufresne]
Updated comments to use print as a function #2234 [radarhere]
Set executable flag on selftest.py, setup.py and added shebang line #2282, #2277 [radarhere, homm]
Test: Increase epsilon for FreeType 2.7 as rendering is slightly different. #2286 [hugovk]
Test: Faster assert_image_similar #2279 [homm]
Removed deprecated internal "stretch" method #2276 [homm]
Removed the handles_eof flag in decode.c #2223 [wiredfool]
Tiff: Fix for writing Tiff to BytesIO using libtiff #2263 [wiredfool]
Doc: Design docs #2269 [wiredfool]
Test: Move tests requiring libtiff to test_file_libtiff #2273 [wiredfool]
Update Maxblock heuristic #2275 [wiredfool]
Fix for 2-bit palette corruption #2274 [pdknsk, wiredfool]
Tiff: Update info.icc_profile when using libtiff reader. #2193 [lambdafu]
Test: Fix bug in test_ifd_rational_save when libtiff is not available #2270 [ChristopherHogan]
ICO: Only save relevant sizes #2267 [hugovk]
ICO: Allow saving .ico files of 256x256 instead of 255x255 #2265 [hugovk]
Fix TIFFImagePlugin ICC color profile saving. #2087 [cskau]
Doc: Improved description of ImageOps.deform resample parameter #2256 [radarhere]
EMF: support negative bounding box coordinates #2249 [glexey]
Close file if opened in WalImageFile #2216 [radarhere]
Use Image._new() instead of _makeself() #2248 [homm]
SunImagePlugin fixes #2241 [wiredfool]
Use minimal scale for jpeg drafts #2240 [homm]
Updated dependency scripts to use FreeType 2.7, OpenJpeg 2.1.2, WebP 0.5.2 and Tcl/Tk 8.6.6 #2235, #2236, #2237, #2290, #2302 [radarhere]
Fix "invalid escape sequence" bytestring warnings in Python 3.6 #2186 [timgraham]
Removed support for Python 2.6 and Python 3.2 #2192 [jdufresne]
Setup: Raise custom exceptions when required/requested dependencies are not found #2213 [wiredfool]
Use a context manager in FontFile.save() to ensure file is always closed #2226 [jdufresne]
Fixed bug in saving to fp-objects in Python >= 3.4 #2227 [radarhere]
Use a context manager in ImageFont._load_pilfont() to ensure file is always closed #2232 [jdufresne]
Use generator expressions instead of list comprehension #2225 [jdufresne]
Close file after reading in ImagePalette.load() #2215 [jdufresne]
Changed behaviour of default box argument for paste method to match docs #2211 [radarhere]
Add support for another BMP bitfield #2221 [jmerdich]
Added missing top-level test __main__ #2222 [radarhere]
Replaced range(len()) #2197 [radarhere]
Fix for ImageQt Segfault, fixes #1370 #2182 [wiredfool]
Setup: Close file in setup.py after finished reading #2208 [jdufresne]
Setup: optionally use pkg-config (when present) to detect dependencies #2074 [garbas]
Search for tkinter first in builtins #2210 [matthew-brett]
Tests: Replace try/except/fail pattern with TestCase.assertRaises() #2200 [jdufresne]
Tests: Remove unused, open files at top level of tests #2188 [jdufresne]
Replace type() equality checks with isinstance #2184 [jdufresne]
Doc: Move ICO out of the list of read-only file formats #2180 [alexwlchan]
Doc: Fix formatting, too-short title underlines and malformed table #2175 [hugovk]
Fix BytesWarnings #2172 [jdufresne]
Use Integer division to eliminate deprecation warning. #2168 [mastermatt]
Doc: Update compatibility matrix [daavve, wiredfool]
Pillow 4.0 no longer supports Python 2.6 and 3.2. We will not be creating binaries, testing, or retaining compatibility with these releases. This release removes some workarounds for those Python releases, so the final working version of Pillow on 2.6 or 3.2 is 3.4.2.
Pillow 4.0 supports Python 3.6.
OleFileIO.py has been removed as a vendored file and is now installed from the upstream olefile PyPI package. All internal dependencies are redirected to the olefile package. Direct accesses to PIL.OlefileIO raises a deprecation warning, then patches the upstream olefile into sys.modules in its place.
It is now possible to save images in modes L, RGB, and RGBA to the uncompressed SGI image format.
Pillow 3.4.0 removed support for creating images with (0,0) size. This has been reenabled, restoring pre 3.4 behavior.
The handles_eof flag for decoding images has been removed, as there were no internal users of the flag. Anyone maintaining image decoders outside of the Pillow source tree should consider using the cleanup function pointers instead.
The stretch function on the core image object has been removed. This used to be for enlarging the image, but has been aliased to resize recently.
Fix Resample coefficient calculation #2162 [homm]
Fix Resample coefficient calculation #2162 [homm]
Allow lists as arguments for Image.new() #2149 [homm]
Allow lists as arguments for Image.new() #2149 [homm]
Fix fix for map.c overflow #2151 (also in 3.3.3) [wiredfool]
Use modern base64 interface over deprecated #2121 [hugovk]
Removed Image.core.open_ppm, added negative image size checks in Image.py. #2146 [wiredfool]
Windows build: fetch dependencies from pillow-depends #2095 [hugovk]
Add TIFF save_all writer. #2140 [lambdafu, vashek]
Move libtiff fd duplication to _load_libtiff #2141 [sekrause]
Speed up GIF save optimization step, fixes #2093. #2133 [wiredfool]
Fix for ImageCms Segfault, Issue #2037. #2131 [wiredfool]
Make Image.crop an immediate operation, not lazy. #2138 [wiredfool]
Skip empty values in ImageFileDirectory #2024 [homm]
Force reloading palette when using mmap in ImageFile. #2139 [lambdafu]
Fix "invalid escape sequence" warning in Python 3.6 #2136 [timgraham]
Update documentation about drafts #2137 [radarhere]
Converted documentation parameter format, comments to docstrings #2021 [radarhere]
Fixed typos #2128 #2142 [radarhere]
Renamed references to OS X to macOS #2125 2130 [radarhere]
Use truth value when checking for progressive and optimize option on save #2115, #2129 [radarhere]
Convert DPI to ints when saving as JPEG #2102 [radarhere]
Added append_images parameter to GIF saving #2103 [radarhere]
Speedup paste with masks up to 80% #2015 [homm]
Rewrite DDS decoders in C, add DXT3 and BC7 decoders #2068 [Mischanix]
Fix PyArg_ParseTuple format in getink() #2070 [arjennienhuis]
Fix saving originally missing TIFF tags. #2111 [anntzer]
Allow pathlib.Path in Image.open on Python 2.7 #2110 [patricksnape]
Use modern base64 interface over deprecated #2121 [hugovk]
ImageColor.getrgb hexadecimal RGBA #2114 [homm]
Test fix for bigendian machines #2092 [wiredfool]
Resampling lookups, trailing empty coefficients, precision #2008 [homm]
Add (un)packing between RGBA and BGRa #2057 [arjennienhuis]
Added return for J2k (and fpx) Load to return a pixel access object #2061 [wiredfool]
Skip failing numpy tests on Pypy <= 5.3.1 #2090 [arjennienhuis]
Show warning when trying to save RGBA image as JPEG #2010 [homm]
Respect pixel centers during transform #2022 [homm]
TOC for supported file formats #2056 [polarize]
Fix conversion of bit images to numpy arrays Fixes #350, #2058 [matthew-brett]
Add ImageOps.scale to expand or contract a PIL image by a factor #2011 [vlmath]
Flake8 fixes #2050 [hugovk]
Updated freetype to 2.6.5 on Appveyor builds #2035 [radarhere]
PCX encoder fixes #2023, pr #2041 [homm]
Docs: Windows console prompts are > #2031 [techtonik]
Expose Pillow package version as PIL.__version__ #2027 [techtonik]
Add Box and Hamming filters for resampling #1959 [homm]
Retain a reference to core image object in PyAccess #2009 [homm]
The nominally private/debugging function Image.core.open_ppm has been removed. If you were using this function, please use Image.open instead.
JPEG images cannot contain an alpha channel. Pillow prior to 3.4.0 silently drops the alpha channel. With this release Pillow will now issue a DeprecationWarning when attempting to save a RGBA mode image as a JPEG. This will become an error in Pillow 4.2.
Two new filters available for Image.resize() and Image.thumbnail() functions: BOX and HAMMING. BOX is the high-performance filter with two times shorter window than BILINEAR. It can be used for image reduction 3 and more times and produces a sharper result than BILINEAR.
HAMMING filter has the same performance as BILINEAR filter while providing the image downscaling quality comparable to BICUBIC. Both new filters don't show good quality for the image upscaling.
Pillow can now decode DXT3 images, as well as the previously supported DXT1 and DXT5 formats. All three formats are now decoded in C code for better performance.
Additional frames can now be appended when saving a GIF file, through the append_images argument. The new frames are passed in as a list of images, which may be have multiple frames themselves.
Note that the append_images argument is only used if save_all is also in effect, e.g.:
im.save(out, save_all=True, append_images=[im1, im2, ...])
Multiple frames can now be saved in a TIFF file by using the save_all option. e.g.:
im.save("filename.tiff", format="TIFF", save_all=True)
Fix fix for map.c overflow #2151 [wiredfool]
Fix fix for map.c overflow #2151 [wiredfool]
Fix negative image sizes in Storage.c #2146 [wiredfool]
Fix negative image sizes in Storage.c #2146 [wiredfool]
Fix integer overflow in map.c #2146 [wiredfool]
Pillow prior to 3.3.2 may experience integer overflow errors in map.c when reading specially crafted image files. This may lead to memory disclosure or corruption.
Specifically, when parameters from the image are passed into Image.core.map_buffer, the size of the image was calculated with xsize * ysize * bytes_per_pixel. This will overflow if the result is larger than SIZE_MAX. This is possible on a 32-bit system.
Furthermore this size value was added to a potentially attacker provided offset value and compared to the size of the buffer without checking for overflow or negative values.
These values were then used for creating pointers, at which point Pillow could read the memory and include it in other images. The image was marked readonly, so Pillow would not ordinarily write to that memory without duplicating the image first.
This issue was found by Cris Neckar at Divergent Security.
Pillow prior to 3.3.2 and PIL 1.1.7 (at least) do not check for negative image sizes in ImagingNew in Storage.c. A negative image size can lead to a smaller allocation than expected, leading to arbitrary writes.
This issue was found by Cris Neckar at Divergent Security.
Fix C90 compilation error for Tcl / Tk rewrite #2033 [matthew-brett]
Fix C90 compilation error for Tcl / Tk rewrite #2033 [matthew-brett]
Fix image loading when rotating by 0 deg #2052 [homm]
Make deprecated functions raise NotImplementedError instead of Exception. #1862, #1890 [daniel-leicht, radarhere]
Fixed enums for Resolution Unit and Predictor in TiffTags.py #1998 [wiredfool]
Fix issue converting P mode to LA #1986 [didrix]
Moved test_j2k_overflow to check_j2k_overflow, prevent DOS of our 32bit testing machines #1995 [wiredfool]
Skip CRC checks in PNG files when LOAD_TRUNCATED_IMAGES is enabled #1991 [kkopachev]
Added CMYK mode for opening EPS files #1826 [radarhere]
Docs: OSX build instruction clarification #1994 [wiredfool]
Docs: Filter comparison table #1993 [homm]
Removal of pthread based Incremental.c, new interface for file decoders/encoders to access the python file. Fixes assorted J2k Hangs. #1934 [wiredfool]
Skip unnecessary passes when resizing #1954 [homm]
Removed duplicate code in ImagePalette #1832 [radarhere]
test_imagecms: Reduce precision of extended info due to 32 bit machine precision #1990 [AbdealiJK]
Binary Tiff Metadata/ICC profile. #1988 [wiredfool]
Ignore large text blocks in PNG if LOAD_TRUNCATED_IMAGES is enabled #1970 [homm]
Replace index = index+1 in docs with +=1 [cclauss]
Skip extra 0xff00 in jpeg #1977 [kkopachev]
Use bytearray for palette mutable storage #1985 [radarhere, wiredfool]
Added additional uint modes for Image.fromarray, more extensive tests of fromarray #1984 [mairsbw, wiredfool]
Fix for program importing PyQt4 when PyQt5 also installed #1942 [hugovk]
Changed depends/install_*.sh urls to point to github pillow-depends repo #1983 [wiredfool]
Allow ICC profile from encoderinfo while saving PNGs #1909 [homm]
Fix integer overflow on ILP32 systems (32-bit Linux). #1975 [lambdafu]
Change function declaration to match Tcl_CmdProc type #1966 [homm]
Integer overflow checks on all calls to *alloc #1781 [wiredfool]
Change equals method on Image so it short circuits #1967 [mattBoros]
Runtime loading of TCL/TK libraries, eliminating build time dependency. #1932 [matthew-brett]
Cleanup of transform methods #1941 [homm]
Fix "Fatal Python error: UNREF invalid object" in debug builds #1936 [wiredfool]
Setup fixes for Alpine linux #1937 [wiredfool]
Split resample into horizontal + vertical passes #1933 [homm]
Box blur with premultiplied alpha #1914 [homm]
Add libimagequant support in quantize() #1889 [rr-]
Added internal Premultiplied luminosity (La) mode #1912 [homm]
Fixed point integer resample #1881 [homm]
Removed docs/BUILDME script #1924 [radarhere]
Moved comments to docstrings #1926 [hugovk]
Include Python.h before wchar.h so _GNU_SOURCE is set consistently #1906 [hugovk]
Updated example decoder in documentation #1899 [radarhere]
Added support for GIF comment extension #1896 [radarhere]
Removed support for pre- 1.5.2 list form of Image info in Image.new #1897 [radarhere]
Fix typos in TIFF tags #1918 [radarhere]
Skip tests that require libtiff if it is not installed #1893 (fixes #1866) [wiredfool]
Skip test when icc profile is not available, fixes #1887. #1892 [doko42]
Make deprecated functions raise NotImplementedError instead of Exception. #1862, #1890 [daniel-leicht, radarhere]
Replaced os.system with subprocess.call in setup.py #1879 [radarhere]
Corrected Image show documentation #1886 [radarhere]
Added check for executable permissions to ImageShow #1880 [radarhere]
Fixed tutorial code and added explanation #1877 [radarhere]
Added OS X support for ImageGrab grabclipboard #1837 [radarhere]
Combined duplicate code in ImageTk #1856 [radarhere]
Added --disable-platform-guessing option to setup.py build extension #1861 [angeloc]
Fixed loading Transparent PNGs with a transparent black color #1840 [olt]
Add support for LA mode in Image.fromarray #1865 [pierriko]
Make ImageFile load images in read-only mode #1864 [hdante]
Added _accept hook for XVThumbImagePlugin #1853 [radarhere]
Test TIFF with LZW compression #1855, TGA RLE file #1854 [hugovk]
Improved SpiderImagePlugin help text #1863 [radarhere]
Updated Sphinx project description #1870 [radarhere]
Remove support for Python 3.0 from _imaging.c #1851 [radarhere]
Jpeg qtables are unsigned chars #1814, #1921 [thebostik]
Added additional EXIF tags #1841, TIFF Tags #1821 [radarhere]
Changed documentation to refer to ImageSequence Iterator #1833 [radarhere]
Fix Fedora prerequisites in installation docs, depends script #1842 [living180]
Added _accept hook for PixarImagePlugin #1843 [radarhere]
Removed outdated scanner classifier #1823 [radarhere]
Combined identical error messages in _imaging #1825 [radarhere]
Added debug option for setup.py to trace header and library finding #1790 [wiredfool]
Fix doc building on travis #1820, #1844 [wiredfool]
Fix for DIB/BMP images #1813, #1847 [wiredfool]
Add PixarImagePlugin file extension #1809 [radarhere]
Catch struct.errors when verifying png files #1805 [wiredfool]
SpiderImagePlugin: raise an error when seeking in a non-stack file #1794 [radarhere, jmichalon]
Added support for 2/4 bpp Tiff grayscale images #1789 [zwhfly]
Removed unused variable from selftest #1788 [radarhere]
Added warning for as_dict method (deprecated in 3.0.0) #1799 [radarhere]
Removed powf support for older Python versions #1784 [radarhere]
Health fixes #1625 #1903 [radarhere]
There is now support for using libimagequant as a higher quality quantization option in Image.quantize() on Unix-like platforms. This support requires building Pillow from source against libimagequant. We cannot distribute binaries due to licensing differences.
There are two new options to control the build_ext task in setup.py:
--debug dumps all of the directories and files that are checked when searching for libraries or headers when building the extensions.
--disable-platform-guessing removes many of the directories that are checked for libraries and headers for build systems or cross compilers that specify that information in via environment variables.
Image resampling for 8-bit per channel images was rewritten using only integer computings. This is faster on most platforms and doesn't introduce precision errors on the wide range of scales. With other performance improvements, this makes resampling 60% faster on average.
Color calculation for images in the LA mode on semitransparent pixels was fixed.
Rotation for angles divisible by 90 degrees now always uses transposition. This greatly improves both quality and performance in this case. Also, the bug with wrong image size calculation when rotating by 90 degrees was fixed.
The return type for binary data in version 2 Exif and Tiff metadata has been changed from a tuple of integers to bytes. This is a change from the behavior since 3.0.0.
Added install docs for Fedora 23 and FreeBSD #1729, #1739, #1792 [koobs, zandermartin, wiredfool]
Added install docs for Fedora 23 and FreeBSD #1729, #1739, #1792 [koobs, zandermartin, wiredfool]
Fixed TIFF multiframe load when the frames have different compression types #1782 [radarhere, geka000]
Added __copy__ method to Image #1772 [radarhere]
Updated dates in PIL license in OleFileIO README #1787 [radarhere]
Corrected Tiff tag names #1786 [radarhere]
Fixed documented name of JPEG property #1783 [radarhere]
Fixed UnboundLocalError when loading a corrupt jpeg2k file #1780 [wiredfool]
Fixed integer overflow in path.c #1773 [wiredfool, nedwill]
Added debug to command line help text for pilprint #1766 [radarhere]
Expose many more fields in ICC Profiles #1756 [lambdafu]
Documentation changes, URL update, transpose, release checklist [radarhere]
Fixed saving to nonexistent files specified by pathlib.Path objects #1748 (fixes #1747) [radarhere]
Round Image.crop arguments to the nearest integer #1745 (fixes #1744) [hugovk]
Fix uninitialized variable warning in _imaging.c:getink #1663 (fixes #486) [wiredfool]
Disable multiprocessing install on cygwin #1700 (fixes #1690) [wiredfool]
Fix the error reported when libz is not found #1764 [wiredfool]
More general error check to avoid Symbol not found: _PyUnicodeUCS2_AsLatin1String on OS X #1761 [wiredfool]
Added py35 to tox envlist #1724 [radarhere]
Fix EXIF tag name typos #1736 [zarlant, radarhere]
Updated freetype to 2.6.3, Tk/Tcl to 8.6.5 and 8.5.19 #1725, #1752 [radarhere]
Add a loader for the FTEX format from Independence War 2: Edge of Chaos #1688 [jleclanche]
Improved alpha_composite documentation #1698 [radarhere]
Extend ImageDraw.text method to pass on multiline_text method specific arguments #1647 [radarhere]
Allow ImageSequence to seek to zero #1686 [radarhere]
ImageSequence Iterator is now an iterator #1649 [radarhere]
Updated windows test builds to jpeg9b #1673 [radarhere]
Fixed support for .gbr version 1 images, added support for version 2 in GbrImagePlugin #1653 [wiredfool]
Clarified which YCbCr format is used #1677 [radarhere]
Added TiffTags documentation, Moved windows build documentation to winbuild/ #1667 [wiredfool]
Add tests for OLE file based formats #1678 [radarhere]
Add TIFF IFD test #1671 [radarhere]
Add a basic DDS image plugin with more tests #1654 [jleclanche, hugovk, wiredfool]
Fix incorrect conditional in encode.c #1638 [manisandro]
The DdsImagePlugin reading DXT1 and DXT5 encoded .dds images was added. DXT3 images are not currently supported.
The FtexImagePlugin reads textures used for 3D objects in Independence War 2: Edge Of Chaos. The plugin reads a single texture per file, in the .ftc (compressed) and .ftu (uncompressed) formats.
The GbrImagePlugin (GIMP brush format) has been updated to fix support for version 1 files and add support for version 2 files.
ImageDraw.multiline_text and ImageDraw.multiline_size take extra spacing parameters above what are used in ImageDraw.text and ImageDraw.size. These parameters can now be passed into ImageDraw.text and ImageDraw.size and they will be passed through to the corresponding multiline functions.
ImageSequence.Iterator is now an actual iterator implementing the Iterator protocol. It is also now possible to seek to the first image of the file when using direct indexing.
Fixed an integer overflow in Jpeg2KEncode.c causing a buffer overflow. CVE-2016-3076 [wiredfool]
Fixed an integer overflow in Jpeg2KEncode.c causing a buffer overflow. CVE-2016-3076 [wiredfool]
Pillow between 2.5.0 and 3.1.1 may overflow a buffer when writing large Jpeg2000 files, allowing for code execution or other memory corruption.
This occurs specifically in the function j2k_encode_entry, at the line:
state->buffer = malloc (tile_width * tile_height * components * prec / 8);
This vulnerability requires a particular value for height * width such that height * width * components * precision overflows, at which point the malloc will be for a smaller value than expected. The buffer that is allocated will be ((height * width * components * precision) mod (2^31) / 8), where components is 1-4 and precision is either 8 or 16. Common values would be 4 components at precision 8 for a standard RGBA image.
The unpackers then split an image that is laid out:
RGBARGBARGBA....
into:
RRR. GGG. BBB. AAA.
If this buffer is smaller than expected, the jpeg2k unpacker functions will write outside the allocation and onto the heap, corrupting memory.
This issue was found by Alyssa Besseling at Atlassian.
Fixed a buffer overflow in PcdDecode.c causing a segfault when opening PhotoCD files. CVE-2016-2533 [wiredfool]
Fixed an integer overflow in Resample.c causing writes in the Python heap. [nedwill]
Fixed a buffer overflow in PcdDecode.c causing a segfault when opening PhotoCD files. CVE-2016-2533 [wiredfool]
Fixed a buffer overflow in FliDecode.c causing a segfault when opening FLI files. CVE-2016-0775 [wiredfool]
Fixed a buffer overflow in TiffDecode.c causing an arbitrary amount of memory to be overwritten when opening a specially crafted invalid TIFF file. CVE-2016-0740 [wiredfool]
Pillow 3.1.0 and earlier when linked against libtiff >= 4.0.0 on x64 may overflow a buffer when reading a specially crafted tiff file.
Specifically, libtiff >= 4.0.0 changed the return type of TIFFScanlineSize from int32 to machine dependent int32|64. If the scanline is sized so that it overflows an int32, it may be interpreted as a negative number, which will then pass the size check in TiffDecode.c line 236. To do this, the logical scanline size has to be > 2gb, and for the test file, the allocated buffer size is 64k against a roughly 4gb scan line size. Any image data over 64k is written over the heap, causing a segfault.
This issue was found by security researcher FourOne.
In all versions of Pillow, dating back at least to the last PIL 1.1.7 release, FliDecode.c has a buffer overflow error (2016-0775).
Around line 192:
case 16:
/* COPY chunk */
for (y = 0; y < state->ysize; y++) {
UINT8* buf = (UINT8*) im->image[y];
memcpy(buf+x, data, state->xsize);
data += state->xsize;
}
break;
The memcpy has error where x is added to the target buffer address. X is used in several internal temporary variable roles, but can take a value up to the width of the image. Im->image[y] is a set of row pointers to segments of memory that are the size of the row. At the max y, this will write the contents of the line off the end of the memory buffer, causing a segfault.
This issue was found by Alyssa Besseling at Atlassian.
In all versions of Pillow, dating back at least to the last PIL 1.1.7 release, PcdDecode.c has a buffer overflow error (2016-2533).
The state.buffer for PcdDecode.c is allocated based on a 3 bytes per pixel sizing, where PcdDecode.c wrote into the buffer assuming 4 bytes per pixel. This writes 768 bytes beyond the end of the buffer into other Python object storage. In some cases, this causes a segfault, in others an internal Python malloc error.
If a large value was passed into the new size for an image, it is possible to overflow an int32 value passed into malloc.
kk = malloc(xsize * kmax * sizeof(float));
...
xbounds = malloc(xsize * 2 * sizeof(int));
xsize is trusted user input. These multiplications can overflow, leading the malloc'd buffer to be undersized. These allocations are followed by a loop that writes out of bounds. This can lead to corruption on the heap of the Python process with attacker controlled float data.
This issue was found by Ned Williamson.
Fixing test failures on Python 2.6/Windows #1633 [wiredfool]
Fixing test failures on Python 2.6/Windows #1633 [wiredfool]
Limit metadata tags when writing using libtiff #1620 [wiredfool]
Rolling back exif support to pre-3.0 format #1627 [wiredfool]
Fix Divide by zero in Exif, add IFDRational class #1531 [wiredfool]
Catch the IFD error near the source #1622 [wiredfool]
Added release notes for 3.1.0 #1623 [radarhere]
Updated spacing to be consistent between multiline methods #1624 [radarhere]
Let EditorConfig take care of some basic formatting #1489 [hugovk]
Restore gpsexif data to the v1 form #1619 [wiredfool]
Add /usr/local include and library directories for freebsd #1613 [leforestier]
Updated installation docs for new versions of dependencies #1611 [radarhere]
Removed unrunnable test file #1610 [radarhere]
Changed register calls to use format property #1608 [radarhere]
Added field type constants to TiffTags #1596 [radarhere]
Allow saving RowsPerStrip with libtiff #1594 [wiredfool]
Enabled conversion to numpy array for HSV images #1578 [cartisan]
Changed some urls in the docs to use https #1580 [hugovk]
Removed logger.exception from ImageFile.py #1590 [radarhere]
Removed warnings module check #1587 [radarhere]
Changed arcs, chords and pie slices to use floats #1577 [radarhere]
Update unit test asserts #1584, #1598 [radarhere]
Fix command to invoke ghostscript for eps files #1478 [baumatron, radarhere]
Consistent multiline text spacing #1574 [wiredfool, hugovk]
Removed unused lines in BDFFontFile #1530 [radarhere]
Changed ImageQt import of Image #1560 [radarhere, ericfrederich]
Throw TypeError if no cursors were found in .cur file #1556 [radarhere]
Fix crash in ImageTk.PhotoImage on win-amd64 #1553 [cgohlke]
ExtraSamples tag should be a SHORT, not a BYTE #1555 [Nexuapex]
Docs and code health fixes #1565 #1566 #1581 #1586 #1591 #1621 [radarhere]
Updated freetype to 2.6.2 #1564 [radarhere]
Updated WebP to 0.5.0 for Travis #1515 #1609 [radarhere]
Fix missing 'version' key value in __array_interface__ #1519 [mattip]
Replaced os.popen with subprocess.Popen to pilprint script #1523 [radarhere]
Catch OverflowError in SpiderImagePlugin #1545 [radarhere, MrShark]
Fix the definition of icc_profile in TiffTags #1539 [wiredfool]
Remove old _imagingtiff.c and pilplus stuff #1499 [hugovk]
Fix Exception when requiring jpeg #1501 [hansmosh]
Dependency scripts for Debian and Ubuntu #1486 [wiredfool]
Added Usage message to painter script #1482 [radarhere]
Add tag info for iccprofile, fixes #1462. #1465 [wiredfool]
Added some requirements for make release-test #1451 [wiredfool]
Flatten tiff metadata value SAMPLEFORMAT to initial value #1467 (fixes #1466) [wiredfool]
Fix handling of pathlib in Image.save #1464 (fixes #1460) [wiredfool]
Make tests more robust #1469 [hugovk]
Use correctly sized pointers for windows handle types #1458 [nu744]
There is no longer a need to ensure that the start and end arguments for arc, chord and pieslice are integers.
Note that these numbers are not simply rounded internally, but are actually utilised in the drawing process.
When using the ImageDraw multiline methods, the spacing between lines was inconsistent, based on the combination on ascenders and descenders.
This has now been fixed, so that lines are offset by their baselines, not the absolute height of each line.
There is also now a default spacing of 4px between lines.
There were major changes in the TIFF ImageFileDirectory support in Pillow 3.0 that led to a number of regressions. Some of them have been fixed in Pillow 3.1, and some of them have been extended to have different behavior.
Pillow 3.0 changed rational metadata to use a float. In Pillow 3.1, this has changed to allow the expression of 0/0 as a valid piece of rational metadata to reflect usage in the wild.
Rational metadata is now encapsulated in an IFDRational instance. This class extends the Rational class to allow a denominator of 0. It compares as a float or a number, but does allow access to the raw numerator and denominator values through attributes.
When used in a ImageFileDirectory_v1, a 2 item tuple is returned of the numerator and denominator, as was done previously.
This class should be used when adding a rational value to an ImageFileDirectory for saving to image metadata.
In Pillow 3.0, the dictionary returned from the private, experimental, but generally widely used _getexif function changed to reflect the ImageFileDirectory_v2 format, without a fallback to the previous format.
In Pillow 3.1, _getexif now returns a dictionary compatible with Pillow 2.9 and earlier, built with ImageFileDirectory_v1 instances. Additionally, any single item tuples have been unwrapped and return a bare element.
The format returned by Pillow 3.0 has been abandoned. A more fully featured interface for EXIF is anticipated in a future release.
In Pillow 3.0 and 3.1, images that contain metadata that is internally consistent, but not in agreement with the TIFF spec, may cause an exception when reading the metadata. This can happen when a tag that is specified to have a single value is stored with an array of values.
It is anticipated that this behavior will change in future releases.
Nothing published for this version
Nothing published for this version
Removed deprecated code, Image.tostring, Image.fromstring, Image.offset, ImageDraw.setink, ImageDraw.setfill, ImageFileIO, ImageFont.FreeTypeFont and…
Check flush method existence for file-like object #1398 [mrTable, radarhere]
Added PDF multipage saving #1445 [radarhere]
Removed deprecated code, Image.tostring, Image.fromstring, Image.offset, ImageDraw.setink, ImageDraw.setfill, ImageFileIO, ImageFont.FreeTypeFont and ImageFont.truetype file kwarg, ImagePalette private _make functions, ImageWin.fromstring and ImageWin.tostring #1343 [radarhere]
Load more broken images #1428 [homm]
Require zlib and libjpeg #1439 [wiredfool]
Preserve alpha when converting from a QImage to a Pillow Image by using png instead of ppm #1429 [ericfrederich]
Qt needs 32 bit aligned image data #1430 [ericfrederich]
Tiff ImageFileDirectory rewrite #1419 [anntzer, wiredfool, homm]
Removed spammy debug logging #1423 [wiredfool]
Save as GiF89a with support for animation parameters #1384 [radarhere]
Correct convert matrix docs #1426 [wiredfool]
Catch TypeError in _getexif #1414 [radarhere, wiredfool]
Fix for UnicodeDecodeError in TiffImagePlugin #1416 [bogdan199, wiredfool]
Dedup code in image.open #1415 [wiredfool]
Skip any number extraneous chars at the end of JPEG chunks #1337 [homm]
Single threaded build for pypy3, refactor #1413 [wiredfool]
Fix loading of truncated images with LOAD_TRUNCATED_IMAGES enabled #1366 [homm]
Documentation update for concepts: bands #1406 [merriam]
Add Solaris/SmartOS include and library directories #1356 [njones11]
Improved handling of getink color #1387 [radarhere]
Disable compiler optimizations for topalette and tobilevel functions for all msvc versions #1402 (fixes #1357) [cgohlke]
Skip ImageFont_bitmap test if _imagingft C module is not installed #1409 [homm]
Add param documentation to ImagePalette #1381 [bwrsandman]
Corrected scripts path #1407 [radarhere]
Updated libtiff to 4.0.6 #1405, #1421 [radarhere]
Updated Platform Support for Yosemite #1403 [radarhere]
Fixed infinite loop on truncated file #1401 [radarhere]
Check that images are L mode in ImageMorph methods #1400 [radarhere]
In tutorial of pasting images, add to mask text #1389 [merriam]
Style/health fixes #1391, #1397, #1417, #1418 [radarhere]
Test on Python 3.5 dev and 3.6 nightly #1361 [hugovk]
Fix fast rotate operations #1373 [radarhere]
Added support for pathlib Path objects to open and save #1372 [radarhere]
Changed register calls to use format property #1333 [radarhere]
Added support for ImageGrab.grab to OS X #1367, #1443 [radarhere, hugovk]
Fixed PSDraw stdout Python 3 compatibility #1365 [radarhere]
Added Python 3.3 to AppVeyor #1363 [radarhere]
Treat MPO with unknown header as base JPEG file #1350 [hugovk, radarhere]
Added various tests #1330, #1344 [radarhere]
More ImageFont tests #1327 [hugovk]
Use logging instead of print #1207 [anntzer]
Several methods that have been marked as deprecated for many releases have been removed in this release:
Image.tostring()
Image.fromstring()
Image.offset()
ImageDraw.setink()
ImageDraw.setfill()
The ImageFileIO module
The ImageFont.FreeTypeFont and ImageFont.truetype file keyword arg
The ImagePalette private _make functions
ImageWin.fromstring()
ImageWin.tostring()
There is now support for saving multipage images in the GIF and PDF formats. To enable this functionality, pass in save_all=True as a keyword argument to the save:
im.save('test.pdf', save_all=True)
The TIFF ImageFileDirectory metadata code has been rewritten. Where previously it returned a somewhat arbitrary set of values and tuples, it now returns bare values where appropriate and tuples when the metadata item is a sequence or collection.
The original metadata is still available in the TiffImage.tags, the new values are available in the TiffImage.tags_v2 member. The old structures will be deprecated at some point in the future. When saving TIFF metadata, new code should use the TiffImagePlugin.ImageFileDirectory_v2 class.
The external dependencies on libjpeg and zlib are now required by default. If the headers or libraries are not found, then installation will abort with an error. This behaviour can be disabled with the --disable-libjpeg and --disable-zlib flags.
Added test for GimpPaletteFile #1324 [radarhere]
Added test for GimpPaletteFile #1324 [radarhere]
Merged gifmaker script to allow saving of multi-frame GIF images #1320 [radarhere]
Added is_animated property to multi-frame formats #1319 [radarhere]
Fixed ValueError in Python 2.6 #1315 #1316 [cgohlke, radarhere]
Fixed tox test script path #1308 [radarhere]
Added width and height properties #1304 [radarhere]
Update tiff and tk tcl 8.5 versions #1303 [radarhere, wiredfool]
Add functions to convert: Image <-> QImage; Image <-> QPixmap #1217 [radarhere, rominf]
Remove duplicate code in gifmaker script #1294 [radarhere]
Multiline text in ImageDraw #1177 [allo-, radarhere]
Automated Windows CI/build support #1278 [wiredfool]
Removed support for Tk versions earlier than 8.4 #1288 [radarhere]
Fixed polygon edge drawing #1255 (fixes #1252) [radarhere]
Check prefix length in _accept methods #1267 [radarhere]
Register MIME type for BMP #1277 [coldmind]
Adjusted ImageQt use of unicode() for 2/3 compatibility #1218 [radarhere]
Identify XBM file created with filename including underscore #1230 (fixes #1229) [hugovk]
Copy image when saving in GifImagePlugin #1231 (fixes #718) [radarhere]
Removed support for FreeType 2.0 #1247 [radarhere]
Added background saving to GifImagePlugin #1273 [radarhere]
Provide n_frames attribute to multi-frame formats #1261 [anntzer, radarhere]
Add duration and loop set to GifImagePlugin #1172, #1269 [radarhere]
Ico files are little endian #1232 [wiredfool]
Upgrade olefile from 0.30 to 0.42b #1226 [radarhere, decalage2]
Setting transparency value to 0 when the tRNS contains only null byte(s) #1239 [juztin]
Separated out feature checking from selftest #1233 [radarhere]
Style/health fixes [radarhere]
Update WebP from 0.4.1 to 0.4.3 #1235 [radarhere]
Release GIL during image load (decode) #1224 [lkesteloot]
Added icns save #1185 [radarhere]
Fix putdata memory leak #1196 [benoit-pierre]
Keep user-specified ordering of icon sizes #1193 [karimbahgat]
Tiff: allow writing floating point tag values #1113 [bpedersen2]
Bug fix: Fixed Tiff handling of bad EXIF data [radarhere]
Bug fix: Fixed Tiff handling of bad EXIF data [radarhere]
Bug fix: Catch struct.error on invalid JPEG, fixes #1163. #1165 [wiredfool, hugovk]
Bug fix: Catch struct.error on invalid JPEG, fixes #1163. #1165 [wiredfool, hugovk]
Fix 32-bit BMP loading (RGBA or RGBX) #1125 [artscoop]
Fix 32-bit BMP loading (RGBA or RGBX) #1125 [artscoop]
Fix UnboundLocalError in ImageFile #1131 [davarisg]
Re-enable test image caching #982 [hugovk, homm]
Fix: Cannot identify EPS images #1152 (fixes #1104) [hugovk]
Configure setuptools to run nosetests, fixes #729 [aclark4life]
Style/health fixes [radarhere, hugovk]
Add support for HTTP response objects to Image.open() #1151 [mfitzp]
Improve reference docs for PIL.ImageDraw.Draw.pieslice() #1145 [audreyr]
Added copy method font_variant() and accessible properties to truetype() #1123 [radarhere]
Fix ImagingEffectNoise #1128 [hugovk]
Remove unreachable code #1126 [hugovk]
Let Python do the endian stuff + tests #1121 [amoibos, radarhere]
Fix webp decode memory leak #1114 [benoit-pierre]
Fast path for opaque pixels in RGBa unpacker #1088 [bgilbert]
Enable basic support for 'RGBa' raw encoding/decoding #1096 [immerrr]
Fix pickling L mode images with no palette, #1095 [hugovk]
iPython display hook #1091 [wiredfool]
Adjust buffer size when quality=keep #1079 (fixes #148 again) [wiredfool]
Fix for corrupted bitmaps embedded in truetype fonts #1072 [jackyyf, wiredfool]
HTTP response objects returned from urllib2.urlopen(url) or requests.get(url, stream=True).raw are 'file-like' but do not support .seek() operations. As a result PIL was unable to open them as images, requiring a wrap in cStringIO or BytesIO.
Now new functionality has been added to Image.open() by way of an .seek(0) check and catch on exception AttributeError or io.UnsupportedOperation. If this is caught we attempt to wrap the object using io.BytesIO (which will only work on buffer-file-like objects).
This allows opening of files using both urllib2 and requests, e.g.:
Image.open(urllib2.urlopen(url)) Image.open(requests.get(url, stream=True).raw)
If the response uses content-encoding (compression, either gzip or deflate) then this will fail as both the urllib2 and requests raw file object will produce compressed data in that case. Using Content-Encoding on images is rather non-sensical as most images are already compressed, but it can still happen.
For requests the work-around is to set the decode_content attribute on the raw object to True:
response = requests.get(url, stream=True) response.raw.decode_content = True image = Image.open(response.raw)
Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool]
Split Sane into a separate repo: https://github.com/python-pillow/Sane [hugovk]
Look for OS X and Linux fonts in common places #1054 [charleslaw]
Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool]
Use underscores, not spaces, in TIFF tag kwargs #1044, #1058 [anntzer, hugovk]
Update PSDraw for Python3, add tests #1055 [hugovk]
Use Bicubic filtering by default for thumbnails. Don't use Jpeg Draft mode for thumbnails #1029 [homm]
Fix MSVC compiler error: Use Py_ssize_t instead of ssize_t #1051 [cgohlke]
Fix compiler error: MSVC needs variables defined at the start of the block #1048 [cgohlke]
The GIF Palette optimization algorithm is only applicable to mode='P' or 'L' #993 [moriyoshi]
Use PySide as an alternative to PyQt4/5 #1024 [holg]
Replace affine-based im.resize implementation with convolution-based im.stretch #997 [homm]
Replace Gaussian Blur implementation with iterated fast box blur. #961 Note: Radius parameter is interpreted differently than before. [homm]
Better docs explaining import _imaging failure #1016, build #1017, mode #1018, PyAccess, PixelAccess objects #1019 Image.quantize #1020 and Image.save #1021 [wiredfool]
Fix for saving TIFF image into an io.BytesIO buffer #1011 [mfergie]
Fix antialias compilation on debug versions of Python #1010 [wiredfool]
Fix for Image.putdata segfault #1009 [wiredfool]
Ico save, additional tests #1007 [exherb]
Use PyQt4 if it has already been imported, otherwise prefer PyQt5 #1003 [AurelienBallier]
Speedup resample implementation up to 2.5 times #977 [homm]
Speed up rotation by using cache aware loops, added transpose to rotations #994 [homm]
Fix Bicubic interpolation #970 [homm]
Support for 4-bit grayscale TIFF images #980 [hugovk]
Updated manifest #957 [wiredfool]
Fix PyPy 2.4 regression #958 [wiredfool]
Webp Metadata Skip Test comments #954 [wiredfool]
Fixes for things rpmlint complains about #942 [manisandro]
The Sane plugin has now been split into its own repo: https://github.com/python-pillow/Sane .
To prevent potential denial of service attacks using compressed text chunks, there are now limits to the decompressed size of text chunks decoded from PNG images. If the limits are exceeded when opening a PNG image a ValueError will be raised.
Individual text chunks are limited to PIL.PngImagePlugin.MAX_TEXT_CHUNK, set to 1MB by default. The total decompressed size of all text chunks is limited to PIL.PngImagePlugin.MAX_TEXT_MEMORY, which defaults to 64MB. These values can be changed prior to opening PNG images if you know that there are large text blocks that are desired.
Image resizing methods ~PIL.Image.Image.resize and ~PIL.Image.Image.thumbnail take a resample argument, which tells which filter should be used for resampling. Possible values are: NEAREST, BILINEAR, BICUBIC and ANTIALIAS. Almost all of them were changed in this version.
From the beginning BILINEAR and BICUBIC filters were based on affine transformations and used a fixed number of pixels from the source image for every destination pixel (2x2 pixels for BILINEAR and 4x4 for BICUBIC). This gave an unsatisfactory result for downscaling. At the same time, a high quality convolutions-based algorithm with flexible kernel was used for ANTIALIAS filter.
Starting from Pillow 2.7.0, a high quality convolutions-based algorithm is used for all of these three filters.
If you have previously used any tricks to maintain quality when downscaling with BILINEAR and BICUBIC filters (for example, reducing within several steps), they are unnecessary now.
A new LANCZOS constant was added instead of ANTIALIAS.
When ANTIALIAS was initially added, it was the only high-quality filter based on convolutions. It's name was supposed to reflect this. Starting from Pillow 2.7.0 all resize method are based on convolutions. All of them are antialias from now on. And the real name of the ANTIALIAS filter is Lanczos filter.
The ANTIALIAS constant is left for backward compatibility and is an alias for LANCZOS.
The image upscaling quality with LANCZOS filter was almost the same as BILINEAR due to a bug. This has been fixed.
The BICUBIC filter for affine transformations produced sharp, slightly pixelated image for upscaling. Bicubic for convolutions is more soft.
In most cases, convolution is more a expensive algorithm for downscaling because it takes into account all the pixels of source image. Therefore BILINEAR and BICUBIC filters' performance can be lower than before. On the other hand the quality of BILINEAR and BICUBIC was close to NEAREST. So if such quality is suitable for your tasks you can switch to NEAREST filter for downscaling, which will give a huge improvement in performance.
At the same time performance of convolution resampling for downscaling has been improved by around a factor of two compared to the previous version. The upscaling performance of the LANCZOS filter has remained the same. For BILINEAR filter it has improved by 1.5 times and for BICUBIC by four times.
In Pillow 2.5 the default filter for ~PIL.Image.Image.thumbnail was changed from NEAREST to ANTIALIAS. Antialias was chosen because all the other filters gave poor quality for reduction. Starting from Pillow 2.7.0, ANTIALIAS has been replaced with BICUBIC, because it's faster and ANTIALIAS doesn't give any advantages after downscaling with libjpeg, which uses supersampling internally, not convolutions.
A new method TRANSPOSE has been added for the ~PIL.Image.Image.transpose operation in addition to FLIP_LEFT_RIGHT, FLIP_TOP_BOTTOM, ROTATE_90, ROTATE_180, ROTATE_270. TRANSPOSE is an algebra transpose, with an image reflected across its main diagonal.
The speed of ROTATE_90, ROTATE_270 and TRANSPOSE has been significantly improved for large images which don't fit in the processor cache.
The ~PIL.ImageFilter.GaussianBlur implementation has been replaced with a sequential application of box filters. The new implementation is based on "Theoretical foundations of Gaussian convolution by extended box filtering" from the Mathematical Image Analysis Group. As ~PIL.ImageFilter.UnsharpMask implementations use Gaussian blur internally, all changes from this chapter are also applicable to it.
There was an error in the previous version of Pillow, where blur radius (the standard deviation of Gaussian) actually meant blur diameter. For example, to blur an image with actual radius 5 you were forced to use value 10. This has been fixed. Now the meaning of the radius is the same as in other software.
If you used a Gaussian blur with some radius value, you need to divide this value by two.
Box filter computation time is constant relative to the radius and depends on source image size only. Because the new Gaussian blur implementation is based on box filter, its computation time also doesn't depend on the blur radius.
For example, previously, if the execution time for a given test image was 1 second for radius 1, 3.6 seconds for radius 10 and 17 seconds for 50, now blur with any radius on same image is executed for 0.2 seconds.
The previous implementation takes into account only source pixels within 2 * standard deviation radius for every destination pixel. This was not enough, so the quality was worse compared to other Gaussian blur software.
The new implementation does not have this drawback.
Several kwarg parameters for saving TIFF images were previously specified as strings with included spaces (e.g. 'x resolution'). This was difficult to use as kwargs without constructing and passing a dictionary. These parameters now use the underscore character instead of space. (e.g. 'x_resolution')
Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool]
Fix CVE-2014-9601, potential PNG decompression DOS #1060 [wiredfool]
Fix Regression in PyPy 2.4 in streamio #958 [wiredfool]
Fix SciPy regression in Image.resize #945 [wiredfool]
Fix SciPy regression in Image.resize #945 [wiredfool]
Fix manifest to include all test files. [aclark4life]
Relax precision of ImageDraw tests for x86, GimpGradient for PPC #930 [wiredfool]
Relax precision of ImageDraw tests for x86, GimpGradient for PPC #930 [wiredfool]
PIL/IcnsImagePlugin.py in Pillow before 2.3.2 and 2.5.x before 2.5.2 allows remote attackers to cause a denial of service via a crafted block size.
Found and reported by Andrew Drake of Dropbox.
Fixed CVE-2014-3598, a DOS in the Jpeg2KImagePlugin (backport) [Andrew Drake]
Fixed CVE-2014-3598, a DOS in the Jpeg2KImagePlugin (backport) [Andrew Drake]
Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin (backport) [Andrew Drake]
Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin (backport) [Andrew Drake]
PIL/IcnsImagePlugin.py in Pillow before 2.3.2 and 2.5.x before 2.5.2 allows remote attackers to cause a denial of service via a crafted block size.
Found and reported by Andrew Drake of Dropbox.
Fixed install issue if Multiprocessing.Pool is not available [wiredfool]
Fixed install issue if Multiprocessing.Pool is not available [wiredfool]
32bit mult overflow fix #782 [wiredfool]
Imagedraw rewrite #737 [terseus, wiredfool]
Imagedraw rewrite #737 [terseus, wiredfool]
Add support for multithreaded test execution #755 [wiredfool]
Prevent shell injection #748 [mbrown1413, wiredfool]
Support for Resolution in BMP files #734 [gcq]
Fix error in setup.py for Python 3 #744 [matthew-brett]
Pyroma fix and add Python 3.4 to setup metadata #742 [wirefool]
Top level flake8 fixes #741 [aclark4life]
Remove obsolete Animated Raster Graphics (ARG) support #736 [hugovk]
Fix test_imagedraw failures #727 [cgohlke]
Fix AttributeError: class Image has no attribute 'DEBUG' #726 [cgohlke]
Fix msvc warning: 'inline' : macro redefinition #725 [cgohlke]
Cleanup #654 [dvska, hugovk, wiredfool]
16-bit monochrome support for JPEG2000 #730 [videan42]
Fixed ImagePalette.save [brightpisces]
Support JPEG qtables #677 [csinchok]
Add binary morphology addon [dov, wiredfool]
Decompression bomb protection #674 [hugovk]
Put images in a single directory #708 [hugovk]
Support OpenJpeg 2.1 #681 [al45tair, wiredfool]
Remove unistd.h #include for all platforms #704 [wiredfool]
Use unittest for tests [hugovk]
ImageCms fixes [hugovk]
Added more ImageDraw tests [hugovk]
Added tests for Spider files [hugovk]
Use libtiff to write any compressed tiff files #669 [wiredfool]
Support for pickling Image objects [hugovk]
Fixed resolution handling for EPS thumbnails #619 [eliempje]
Fixed rendering of some binary EPS files (Issue #302) [eliempje]
Rename variables not to use built-in function names #670 [hugovk]
Ignore junk JPEG markers [hugovk]
Change default interpolation for Image.thumbnail to Image.ANTIALIAS [hugovk]
Add tests and fixes for saving PDFs [hugovk]
Remove transparency resource after P->RGBA conversion [hugovk]
Clean up preprocessor cruft for Windows #652 [CounterPillow]
Adjust Homebrew freetype detection logic #656 [jacknagel]
Added Image.close, context manager support [wiredfool]
Added support for 16 bit PGM files [wiredfool]
Updated OleFileIO to version 0.30 from upstream #618 [hugovk]
Added support for additional TIFF floating point format [Hijackal]
Have the tempfile use a suffix with a dot [wiredfool]
Fix variable name used for transparency manipulations #604 [nijel]
Indexed Transparency handled for conversions between L, RGB, and P modes #574 (fixes #510) [wiredfool]
Indexed Transparency handled for conversions between L, RGB, and P modes #574 (fixes #510) [wiredfool]
Conversions enabled from RGBA->P #574 (fixes #544) [wiredfool]
Improved icns support #565 [al45tair]
Fix libtiff leaking open files #580 (fixes #526) [wiredfool]
Fixes for Jpeg encoding in Python 3 #578 (fixes #577) [wiredfool]
Added support for JPEG 2000 #547 [al45tair]
Add more detailed error messages to Image.py #566 [larsmans]
Avoid conflicting _expand functions in PIL & MINGW, fixes #538 [aclark4life]
Merge from Philippe Lagadec’s OleFileIO_PL fork #512 [vadmium]
Fix ImageColor.getcolor #534 [homm]
Make ICO files work with the ImageFile.Parser interface #525 (fixes #522) [wiredfool]
Handle 32bit compiled python on 64bit architecture #521 [choppsv1]
Fix support for characters >128 using .pcf or .pil fonts in Py3k #517 (fixes #505) [wiredfool]
Skip CFFI test earlier if it's not installed #516 [wiredfool]
Fixed opening and saving odd sized .pcx files #535 (fixes #523) [wiredfool]
Fixed palette handling when converting from mode P->RGB->P [d-schmidt]
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 #504 [e98cuenc]
Fixed DOS with invalid palette size or invalid image size in BMP file [wiredfool]
Added support for BMP version 4 and 5 [eddwardo, wiredfool]
Fix segfault in getfont when passed a memory resident font [wiredfool]
Fix crash on Saving a PNG when icc-profile is None #496 [brutasse]
Cffi+Python implementation of the PixelAccess object [wiredfool]
PixelAccess returns unsigned ints for I16 mode [wiredfool]
Minor patch on booleans + Travis #474 [sciunto]
Look in multiarch paths in GNU platforms #511 [pinotree]
Add arch support for pcc64, s390, s390x, armv7l, aarch64 #475 [manisandro]
Add arch support for ppc [wiredfool]
Correctly quote file names for WindowsViewer command [cgohlke]
Prefer homebrew freetype over X11 freetype (but still allow both) #466 [dmckeone]
Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin (backport) [Andrew Drake]
Fixed CVE-2014-3589, a DOS in the IcnsImagePlugin (backport) [Andrew Drake]
PIL/IcnsImagePlugin.py in Pillow before 2.3.2 and 2.5.x before 2.5.2 allows remote attackers to cause a denial of service via a crafted block size.
Found and reported by Andrew Drake of Dropbox.
Fix insecure use of tempfile.mktemp (CVE-2014-1932 CVE-2014-1933) [wiredfool]
Fix insecure use of tempfile.mktemp (CVE-2014-1932 CVE-2014-1933) [wiredfool]
These issues were reported in Debian bug #737059.
The (1) load_djpeg function in JpegImagePlugin.py, (2) Ghostscript function in EpsImagePlugin.py, (3) load function in IptcImagePlugin.py, and (4) _copy function in Image.py in Pillow before 2.3.1 do not properly create temporary files, which allow local users to overwrite arbitrary files and obtain sensitive information via a symlink attack on the temporary file.
The (1) JpegImagePlugin.py and (2) EpsImagePlugin.py scripts in Pillow before 2.3.1 uses the names of temporary files on the command line, which makes it easier for local users to conduct symlink attacks by listing the processes.
Stop leaking filename parameter passed to getfont #459 [jpharvey]
Stop leaking filename parameter passed to getfont #459 [jpharvey]
Report availability of LIBTIFF during setup and selftest [cgohlke]
Fix msvc build error C1189: "No Target Architecture" #460 [cgohlke]
Fix memory leak in font_getsize [wiredfool]
Correctly prioritize include and library paths #442 [ohanar]
Image.point fixes for numpy.array and docs #441 [wiredfool]
Save the transparency header by default for PNGs #424 [wiredfool]
Support for PNG tRNS header when converting from RGB->RGBA #423 [wiredfool]
PyQT5 Support #418 [wiredfool]
Updates for saving color tiffs w/compression using libtiff #417 [wiredfool]
2gigapix image fixes and redux [wiredfool]
Save arbitrary tags in Tiff image files #369 [wiredfool]
Quote filenames and title before using on command line #398 [tmccombs]
Fixed Viewer.show to return properly #399 [tmccombs]
Documentation fixes [wiredfool]
Fixed memory leak saving images as webp when webpmux is available #429 [cezarsa]
Fix compiling with FreeType 2.5.1 #427 [stromnov]
Adds directories for NetBSD #411 [deepy]
Support RGBA TIFF with missing ExtraSamples tag #393 [cgohlke]
Lossless WEBP Support #390 [wiredfool]
Take compression as an option in the save call for tiffs #389 [wiredfool]
Add support for saving lossless WebP. Just pass 'lossless=True' to save() #386 [liftoff]
LCMS support upgraded from version 1 to version 2 #380 (fixes #343) [wiredfool]
Added more raw decoder 16 bit pixel formats #379 [svanheulen]
Document remaining Image* modules listed in PIL handbook [irksep]
Document ImageEnhance, ImageFile, ImageFilter, ImageFont, ImageGrab, ImageMath, and ImageOps [irksep]
Port and update docs for Image, ImageChops, ImageColor, and ImageDraw [irksep]
Move or copy content from README.rst to docs/ [irksep]
Respect CFLAGS/LDFLAGS when searching for headers/libs [iElectric]
Port PIL Handbook tutorial and appendices [irksep]
Alpha Premultiplication support for transform and resize #364 [wiredfool]
Fixes to make Pypy 2.1.0 work on Ubuntu 12.04/64 #359 [wiredfool]
Fix compiling with FreeType 2.5.1 #427 [stromnov]
Fix compiling with FreeType 2.5.1 #427 [stromnov]
Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) #357 (fixes #356) [wiredfool]
Error installing Pillow 2.2.0 on Mac OS X (due to hard dep on brew) #357 (fixes #356) [wiredfool]
Bug in image transformations resulting from uninitialized memory #348 (fixes #254) [nikmolnar]
Bug in image transformations resulting from uninitialized memory #348 (fixes #254) [nikmolnar]
Fix for encoding of b_whitespace #346 (similar to closed issue #272) [mhogg]
Add numpy array interface support for 16 and 32 bit integer modes #347 (fixes #273) [cgohlke]
Partial fix for #290: Add preliminary support for TIFF tags. [wiredfool]
Fix #251 and #326: circumvent classification of pngtest_bad.png as malware [cgohlke]
Add typedef uint64_t for MSVC #339 [cgohlke]
setup.py: better support for C_INCLUDE_PATH, LD_RUN_PATH, etc. #336 (fixes #329) [nu774]
_imagingcms.c: include windef.h to fix build issue on MSVC #335 (fixes #328) [nu774]
Automatically discover homebrew include/ and lib/ paths on OS X #330 [donspaulding]
Fix bytes which should be bytearray #325 [manisandro]
Add respective paths for C_INCLUDE_PATH, LD_RUN_PATH (rpath) to build if specified as environment variables #324 [seanupton]
Fix #312 + gif optimize improvement [d-schmidt]
Be more tolerant of tag read failures #320 [ericbuehl]
Catch truncated zTXt errors #321 (fixes #318) [vytisb]
Fix IOError when saving progressive JPEGs #313 [e98cuenc]
Add RGBA support to ImageColor #309 [yoavweiss]
Test for str, not "utf-8" #306 (fixes #304) [mjpieters]
Fix missing import os in _util.py #303 [mnowotka]
Added missing exif tags #300 [freyes]
Fail on all import errors #298, #299 (fixes #297) [macfreek, wiredfool]
Fixed Windows fallback (wasn't using correct file in Windows fonts) #295 [lmollea]
Moved ImageFile and ImageFileIO comments to docstrings #293 [freyes]
Restore compatibility with ISO C #289 [cgohlke]
Use correct format character for C int type #288 [cgohlke]
Allocate enough memory to hold pointers in encode.c #287 [cgohlke]
Fillorder double shuffling bug when FillOrder ==2 and decoding using libtiff #284 (fixes #279) [wiredfool]
Moved Image module comments to docstrings. [freyes]
Add 16-bit TIFF support #277 (fixes #274) [wiredfool]
Ignore high ascii characters in string.whitespace #276 (fixes #272) [wiredfool]
Added clean/build to tox to make it behave like Travis #275 [freyes]
Adding support for metadata in webp images #271 [heynemann]
Add /usr/bin/env python shebangs to all scripts in /Scripts #197 [mgorny]
Add /usr/bin/env python shebangs to all scripts in /Scripts #197 [mgorny]
Add several TIFF decoders and encoders #268 [megabuz]
Added support for alpha transparent webp images.
Adding Python 3 support for StringIO.
Adding Python3 basestring compatibility without changing basestring.
Fix webp encode errors on win-amd64 #259 [cgohlke]
Better fix for ZeroDivisionError in ImageOps.fit for image.size height is 1 #267 [chrispbailey]
Better support for ICO images.
Changed PY_VERSION_HEX #190 (fixes #166)
Changes to put everything under the PIL namespace #191 [wiredfool]
Changing StringIO to BytesIO.
Cleanup whitespace. [Arfrever]
Don't skip 'import site' on initialization when running tests for inplace builds. [cgohlke]
Enable warnings for test suite #227 [wiredfool]
Fix for ZeroDivisionError in ImageOps.fit for image.size == (1,1) #255 [pterk]
Fix for if isinstance(filter, collections.Callable) crash. Python bug #7624 on <2.6.6
Remove double typedef declaration #194 (fixes #193) [evertrol]
Fix msvc compile errors (#230).
Fix rendered characters have been chipped for some TrueType fonts [tk0miya]
Fix usage of pilfont.py script #184 [fabiomcosta]
Fresh start for docs, generated by sphinx-apidoc.
Introduce --enable-x and fail if it is given and x is not available.
Partial work to add a wrapper for WebPGetFeatures to correctly support #220 (fixes #204)
Significant performance improvement of alpha_composite function #156 [homm]
Support explicitly disabling features via --disable-* options #240 [mgorny]
Support selftest.py --installed, fixes #263
Transparent WebP Support #220 (fixes #204) [euangoddard, wiredfool]
Use PyCapsule for py3.1 #238 (fixes #237) [wiredfool]
Workaround for: https://bugs.python.org/issue16754 in 3.2.x < 3.2.4 and 3.3.0.
.. Note:: Special thanks to Christoph Gohlke and Eric Soroos for assisting with a pre-PyCon 2013 release!
Note
Special thanks to Christoph Gohlke and Eric Soroos for assisting with a pre-PyCon 2013 release!
Many other bug fixes and enhancements by many other people.
Add Python 3 support. (Pillow >= 2.0.0 supports Python 2.6, 2.7, 3.2, 3.3. Pillow < 2.0.0 supports Python 2.4, 2.5, 2.6, 2.7.) [fluggo]
Add PyPy support (experimental, please see #67)
Add WebP support #96 [lqs]
Add Tiff G3/G4 support (experimental) [wiredfool]
Backport PIL's PNG/Zip improvements #95, #97 [olt]
Various 64-bit and Windows fixes. [cgohlke]
Add testing suite. [cgohlke, fluggo]
Added support for PNG images with transparency palette. [d-schmidt]
Removed doctests.py that made tests of other packages fail. [thomasdesvenain]
Removed doctests.py that made tests of other packages fail. [thomasdesvenain]
Fix opening psd files with RGBA layers when A mode is not of type 65535 but 3. Fixes #3 [thomasdesvenain]
UNDEF more types before including windows headers [mattip]
UNDEF more types before including windows headers [mattip]
Bug fix: freetype not found on Mac OS X with case-sensitive filesystem [gjo]
Bug fix: freetype not found on Mac OS X with case-sensitive filesystem [gjo]
Bug fix: Backport fix to split() after open() (regression introduced in PIL 1.1.7). [sfllaw]
Fix for sys.platform = "linux3" [blueyed]
Fix for sys.platform = "linux3" [blueyed]
Package cleanup and additional documentation [aclark4life]
Fix brown bag release [aclark4life]
Fix brown bag release [aclark4life]
Fix : resize need int values, append int conversion in thumbnail method [harobed]
Fix : resize need int values, append int conversion in thumbnail method [harobed]
Bug fix: Python 2.4 compat [aclark4life]
Bug fix: Python 2.4 compat [aclark4life]
More multi-arch support [SteveM, regebro, barry, aclark4life]
More multi-arch support [SteveM, regebro, barry, aclark4life]
Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu [aclark4life]
Add support for multi-arch library directory /usr/lib/x86_64-linux-gnu [aclark4life]
Bug fix: /usr/x11/include should be added to include_dirs not library_dirs [elro]
Bug fix: /usr/x11/include should be added to include_dirs not library_dirs [elro]
Doc fixes [aclark4life]
Module and package fixes [aclark4life]
Module and package fixes [aclark4life]
- Doc fixes [aclark4life]
Doc fixes [aclark4life]
Add support for /lib64 and /usr/lib64 library directories on Linux [aclark4life]
Add support for /lib64 and /usr/lib64 library directories on Linux [aclark4life]
Doc fixes [aclark4life]
On OS X also check for freetype2 in the X11 path [jezdez]
On OS X also check for freetype2 in the X11 path [jezdez]
Doc fixes [aclark4life]
Removed setuptools_hg requirement [aclark4life]
Removed setuptools_hg requirement [aclark4life]
Doc fixes [aclark4life]
Remove support for import Image. from PIL import Image now required.
Remove support for import Image. from PIL import Image now required.
Forked PIL based on Chris McDonough and Hanno Schlichting's setuptools compatible re-packaging [aclark4life]
Your coding agent can read these notes before it upgrades. Set up the MCP server →