5.4.0#

API Changes#

APNG extension to PNG plugin#

Animated Portable Network Graphics (APNG) images are not fully supported but can be opened via the PNG plugin to get some basic info:

im = Image.open("image.apng")
print(im.mode)  # "RGBA"
print(im.size)  # (245, 245)
im.show()  # Shows a single frame

Check for libjpeg-turbo#

You can check if Pillow has been built against the libjpeg-turbo version of the libjpeg library:

from PIL import features
features.check_feature("libjpeg_turbo")  # True or False

Negative indexes in pixel access#

When accessing individual image pixels, negative indexes are now also accepted. For example, to get or set the farthest pixel in the lower right of an image:

px = im.load()
print(px[-1, -1])
px[-1, -1] = (0, 0, 0)

New custom TIFF tags#

TIFF images can now be saved with custom integer, float and string TIFF tags:

im = Image.new("RGB", (200, 100))
custom = {
    37000: 4,
    37001: 4.2,
    37002: "custom tag value",
    37003: u"custom tag value",
    37004: b"custom tag value",
}
im.save("output.tif", tiffinfo=custom)

im2 = Image.open("output.tif")
print(im2.tag_v2[37000])  # 4
print(im2.tag_v2[37002])  # "custom tag value"
print(im2.tag_v2[37004])  # b"custom tag value"

Other Changes#

ImageOps.fit#

Now uses one resize operation with box parameter internally instead of a crop and scale operations sequence. This improves the performance and accuracy of cropping since the box parameter accepts float values.