Skip to content
13 changes: 11 additions & 2 deletions PIL/JpegImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,17 @@ def APP(self, marker):

# If DPI isn't in JPEG header, fetch from EXIF
if "dpi" not in self.info and "exif" in self.info:
x_resolution = self._getexif()[0x011A]
self.info["dpi"] = x_resolution[0] / x_resolution[1]
exif = self._getexif()
try:
resolution_unit = exif[0x0128]
x_resolution = exif[0x011A]
dpi = x_resolution[0] / x_resolution[1]
if resolution_unit == 3: # cm
# 1 dpcm = 2.54 dpi
dpi *= 2.54
self.info["dpi"] = dpi, dpi
except KeyError:
self.info["dpi"] = 72, 72


def COM(self, marker):
Expand Down
Binary file added Tests/images/exif-200dpcm.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Tests/images/no-dpi-in-exif.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 21 additions & 1 deletion Tests/test_file_jpeg.py
Original file line number Diff line number Diff line change
Expand Up @@ -506,7 +506,27 @@ def test_dpi_from_exif(self):
im = Image.open("Tests/images/photoshop-200dpi.jpg")

# Act / Assert
self.assertEqual(im.info.get("dpi"), 200)
self.assertEqual(im.info.get("dpi"), (200, 200))

def test_dpi_from_dpcm_exif(self):
# Arrange
# This is photoshop-200dpi.jpg with EXIF resolution unit set to cm:
# exiftool -exif:ResolutionUnit=cm photoshop-200dpi.jpg
im = Image.open("Tests/images/exif-200dpcm.jpg")

# Act / Assert
self.assertEqual(im.info.get("dpi"), (508, 508))

def test_no_dpi_in_exif(self):
# Arrange
# This is photoshop-200dpi.jpg with resolution removed from EXIF:
# exiftool "-*resolution*"= photoshop-200dpi.jpg
im = Image.open("Tests/images/no-dpi-in-exif.jpg")

# Act / Assert
# "When the image resolution is unknown, 72 [dpi] is designated."
# http://www.exiv2.org/tags.html
self.assertEqual(im.info.get("dpi"), (72, 72))


if __name__ == '__main__':
Expand Down