diff --git a/Tests/test_file_tiff_metadata.py b/Tests/test_file_tiff_metadata.py index fbaec7835..399736750 100644 --- a/Tests/test_file_tiff_metadata.py +++ b/Tests/test_file_tiff_metadata.py @@ -302,7 +302,10 @@ def test_tagtype_on_zero_denominator( with Image.open(out) as reloaded: assert isinstance(reloaded, TiffImagePlugin.TiffImageFile) - assert math.isnan(reloaded.tag_v2[37380]) + if expected == TiffTags.RATIONAL: + assert reloaded.tag_v2[37380] == math.inf + elif TiffTags.SIGNED_RATIONAL: + assert reloaded.tag_v2[37380] == -math.inf def test_undefined_zero(tmp_path: Path) -> None: diff --git a/Tests/test_tiff_ifdrational.py b/Tests/test_tiff_ifdrational.py index 5233cb2b9..efb51cf9c 100644 --- a/Tests/test_tiff_ifdrational.py +++ b/Tests/test_tiff_ifdrational.py @@ -1,6 +1,7 @@ from __future__ import annotations from fractions import Fraction +import math from pathlib import Path import pytest @@ -80,8 +81,14 @@ def test_ifd_rational_save( "numerator, denominator, expected_result", [ (1, 1, 1.0), - (1, 0, float("nan")), + (1, 0, math.inf), + (-1, 0, -math.inf), + (0, 0, float("nan")), ], ) def test_float_cast(numerator, denominator, expected_result): - float(IFDRational(numerator, denominator)) == expected_result + value = float(IFDRational(numerator, denominator)) + if math.isnan(expected_result): + assert value + else: + assert value == expected_result diff --git a/src/PIL/TiffImagePlugin.py b/src/PIL/TiffImagePlugin.py index 9bdf7c015..272adee99 100644 --- a/src/PIL/TiffImagePlugin.py +++ b/src/PIL/TiffImagePlugin.py @@ -372,7 +372,12 @@ class IFDRational(Rational): self._denominator = denominator if denominator == 0: - self._val = float("nan") + if value == 0: + self._val = float("nan") + elif value > 0: + self._val = math.inf + else: + self._val = -math.inf elif denominator == 1: self._val = Fraction(value) elif int(value) == value: @@ -691,7 +696,7 @@ class ImageFileDirectory_v2(_IFDv2Base): if all(isinstance(v, IFDRational) for v in values): for v in values: assert isinstance(v, IFDRational) - if v < 0 or (math.isnan(v) and float(v.numerator) < 0): + if v < 0: self.tagtype[tag] = TiffTags.SIGNED_RATIONAL break else: