From 0de3beaeaf11ca1670148eface36317109cf995b Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Fri, 7 May 2021 20:50:18 +1000 Subject: [PATCH] Removed DPI rounding when BMP loading --- Tests/images/hopper_roundDown.bmp | Bin 49206 -> 0 bytes Tests/test_file_bmp.py | 27 +++++++-------------------- src/PIL/BmpImagePlugin.py | 4 +--- 3 files changed, 8 insertions(+), 23 deletions(-) delete mode 100644 Tests/images/hopper_roundDown.bmp diff --git a/Tests/images/hopper_roundDown.bmp b/Tests/images/hopper_roundDown.bmp deleted file mode 100644 index 62aada05067a1a541f41b03d72feb191a3446022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49206 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 Nz_nPQ^*_KW000}`Qt$u( diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py index d5fe2a4dd..3374fe54e 100644 --- a/Tests/test_file_bmp.py +++ b/Tests/test_file_bmp.py @@ -63,7 +63,7 @@ def test_dpi(): output.seek(0) with Image.open(output) as reloaded: - assert reloaded.info["dpi"] == dpi + assert reloaded.info["dpi"] == (72.008961115161, 72.008961115161) def test_save_bmp_with_dpi(tmp_path): @@ -71,6 +71,7 @@ def test_save_bmp_with_dpi(tmp_path): # Arrange outfile = str(tmp_path / "temp.jpg") with Image.open("Tests/images/hopper.bmp") as im: + assert im.info["dpi"] == (95.98654816726399, 95.98654816726399) # Act im.save(outfile, "JPEG", dpi=im.info["dpi"]) @@ -78,31 +79,17 @@ def test_save_bmp_with_dpi(tmp_path): # Assert with Image.open(outfile) as reloaded: reloaded.load() - assert im.info["dpi"] == reloaded.info["dpi"] - assert im.size == reloaded.size + assert reloaded.info["dpi"] == (96, 96) + assert reloaded.size == im.size assert reloaded.format == "JPEG" -def test_load_dpi_rounding(): - # Round up - with Image.open("Tests/images/hopper.bmp") as im: - assert im.info["dpi"] == (96, 96) - - # Round down - with Image.open("Tests/images/hopper_roundDown.bmp") as im: - assert im.info["dpi"] == (72, 72) - - -def test_save_dpi_rounding(tmp_path): +def test_save_float_dpi(tmp_path): outfile = str(tmp_path / "temp.bmp") with Image.open("Tests/images/hopper.bmp") as im: - im.save(outfile, dpi=(72.2, 72.2)) + im.save(outfile, dpi=(72.21216100543306, 72.21216100543306)) with Image.open(outfile) as reloaded: - assert reloaded.info["dpi"] == (72, 72) - - im.save(outfile, dpi=(72.8, 72.8)) - with Image.open(outfile) as reloaded: - assert reloaded.info["dpi"] == (73, 73) + assert reloaded.info["dpi"] == (72.21216100543306, 72.21216100543306) def test_load_dib(): diff --git a/src/PIL/BmpImagePlugin.py b/src/PIL/BmpImagePlugin.py index 98685be0b..821844484 100644 --- a/src/PIL/BmpImagePlugin.py +++ b/src/PIL/BmpImagePlugin.py @@ -115,9 +115,7 @@ class BmpImageFile(ImageFile.ImageFile): ) file_info["colors"] = i32(header_data, 28) file_info["palette_padding"] = 4 - self.info["dpi"] = tuple( - int(x / 39.3701 + 0.5) for x in file_info["pixels_per_meter"] - ) + self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) if file_info["compression"] == self.BITFIELDS: if len(header_data) >= 52: for idx, mask in enumerate(