mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-10 16:22:22 +03:00
Merge f2a2b1a138
into 2195faf0dc
This commit is contained in:
commit
10b171671a
|
@ -1,6 +1,7 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import io
|
import io
|
||||||
|
import math
|
||||||
import struct
|
import struct
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
@ -280,6 +281,30 @@ def test_writing_other_types_to_undefined(
|
||||||
assert reloaded.tag_v2[33723] == b"1"
|
assert reloaded.tag_v2[33723] == b"1"
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"value, expected",
|
||||||
|
(
|
||||||
|
(IFDRational(1, 0), TiffTags.RATIONAL),
|
||||||
|
(IFDRational(-1, 0), TiffTags.SIGNED_RATIONAL),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
def test_tagtype_on_zero_denominator(
|
||||||
|
value: IFDRational, expected: int, tmp_path: Path
|
||||||
|
) -> None:
|
||||||
|
info = TiffImagePlugin.ImageFileDirectory_v2()
|
||||||
|
|
||||||
|
info[37380] = value
|
||||||
|
assert info.tagtype[37380] == expected
|
||||||
|
|
||||||
|
im = hopper()
|
||||||
|
out = tmp_path / "temp.tiff"
|
||||||
|
im.save(out, tiffinfo=info)
|
||||||
|
|
||||||
|
with Image.open(out) as reloaded:
|
||||||
|
assert isinstance(reloaded, TiffImagePlugin.TiffImageFile)
|
||||||
|
assert math.isnan(reloaded.tag_v2[37380])
|
||||||
|
|
||||||
|
|
||||||
def test_undefined_zero(tmp_path: Path) -> None:
|
def test_undefined_zero(tmp_path: Path) -> None:
|
||||||
# Check that the tag has not been changed since this test was created
|
# Check that the tag has not been changed since this test was created
|
||||||
tag = TiffTags.TAGS_V2[45059]
|
tag = TiffTags.TAGS_V2[45059]
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import math
|
||||||
from fractions import Fraction
|
from fractions import Fraction
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
@ -74,3 +75,18 @@ def test_ifd_rational_save(
|
||||||
with Image.open(out) as reloaded:
|
with Image.open(out) as reloaded:
|
||||||
assert isinstance(reloaded, TiffImagePlugin.TiffImageFile)
|
assert isinstance(reloaded, TiffImagePlugin.TiffImageFile)
|
||||||
assert float(IFDRational(301, 1)) == float(reloaded.tag_v2[282])
|
assert float(IFDRational(301, 1)) == float(reloaded.tag_v2[282])
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"numerator, denominator, expected_result",
|
||||||
|
[
|
||||||
|
(1, 1, 1.0),
|
||||||
|
(1, 0, float("nan")),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_float_cast(numerator: int, denominator: int, expected_result: float) -> None:
|
||||||
|
value = float(IFDRational(numerator, denominator))
|
||||||
|
if math.isnan(expected_result):
|
||||||
|
assert value
|
||||||
|
else:
|
||||||
|
assert value == expected_result
|
||||||
|
|
|
@ -398,6 +398,9 @@ class IFDRational(Rational):
|
||||||
f = self._val.limit_denominator(max_denominator)
|
f = self._val.limit_denominator(max_denominator)
|
||||||
return f.numerator, f.denominator
|
return f.numerator, f.denominator
|
||||||
|
|
||||||
|
def __float__(self) -> float:
|
||||||
|
return float(self._val)
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
return str(float(self._val))
|
return str(float(self._val))
|
||||||
|
|
||||||
|
@ -684,7 +687,7 @@ class ImageFileDirectory_v2(_IFDv2Base):
|
||||||
if all(isinstance(v, IFDRational) for v in values):
|
if all(isinstance(v, IFDRational) for v in values):
|
||||||
for v in values:
|
for v in values:
|
||||||
assert isinstance(v, IFDRational)
|
assert isinstance(v, IFDRational)
|
||||||
if v < 0:
|
if v < 0 or (math.isnan(v) and float(v.numerator) < 0):
|
||||||
self.tagtype[tag] = TiffTags.SIGNED_RATIONAL
|
self.tagtype[tag] = TiffTags.SIGNED_RATIONAL
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user