/imdirect

Monkey patch for PIL, performing automatic rotation of opened JPEG images

Primary LanguagePythonMIT LicenseMIT

imdirect

Build Status Coverage Status

PIL extension performing automatic rotation of opened JPEG images.

imdirect has been archived due to PIL having a built in functionality to perform the same tasks. If you're using Pillow >= 6.0.0, you can use the built-in ImageOps.exif_transpose function do correctly rotate an image according to its exif tag:

from PIL import ImageOps
image = ImageOps.exif_transpose(image)

Description

The orientation of the photographed object or scene with respect to the digital camera is encoded in the resulting image's Exif1 data (given that it is saved as a JPEG). When working with such digital camera images, this orientation might lead to problems handling the image and is very often desired to be counteracted.

This module is a small extension to Pillow that monkey patches the PIL.Image.open method to automatically rotate the image2 (by lossless methods) and update the Exif tag accordingly, given that image is a JPEG.

The package also features a save method that includes the Exif data by default when saving JPEGs.

Installation

pip install imdirect

Usage

Demonstration of the monkey patching and how it works:

>>> from PIL import Image
>>> import imdirect
>>> img = Image.open('image.jpg')
>>> print("{0}, Orientation: {1}".format(img, img._getexif().get(274)))
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=4032x3024 at 0x7F44B5E4FF10>, Orientation: 6
>>> imdirect.monkey_patch()
>>> img_autorotated = Image.open('image.jpg')
>>> print("{0}, Orientation: {1}".format(img_autorotated, img_autorotated._getexif().get(274)))
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=3024x4032 at 0x7F44B5DF5150>, Orientation: 1

The package can also be used without monkey patching, by applying the imdirect.imdirect_open method directly:

>>> from imdirect import imdirect_open
>>> img = imdirect_open('image.jpg')

or by using the imdirect.autorotate on a PIL.Image.Image object:

>>> from PIL import Image
>>> import imdirect
>>> img = Image.open('image.jpg')
>>> img_rotated = imdirect.autorotate(img)

The last method does not return a PIL.JpegImagePlugin.JpegImageFile, but can still be used if the Exif information of the original image is undesired.

Tests

Tests can be run with pytest:

Testing started at 13:28 ...
============================= test session starts ==============================
platform linux2 -- Python 2.7.12, pytest-3.0.1, py-1.4.31, pluggy-0.3.1
rootdir: /home/hbldh/Repos/imdirect, inifile:
collected 4 items

test_autorotate.py ...
test_monkey_patching.py .

=========================== 4 passed in 0.08 seconds ===========================

References


  1. Exif on Wikipedia (https://en.wikipedia.org/wiki/Exif)

  2. Exif orientation (http://sylvana.net/jpegcrop/exif_orientation.html)