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.