mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-03-03 03:25:53 +03:00
Merge pull request #5476 from radarhere/dpi_rounding
This commit is contained in:
commit
a72ae6823c
Binary file not shown.
Before Width: | Height: | Size: 48 KiB |
Binary file not shown.
Before Width: | Height: | Size: 20 KiB |
|
@ -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():
|
||||
|
|
|
@ -656,15 +656,6 @@ class TestFileJpeg:
|
|||
reloaded.load()
|
||||
assert im.info["dpi"] == reloaded.info["dpi"]
|
||||
|
||||
def test_load_dpi_rounding(self):
|
||||
# Round up
|
||||
with Image.open("Tests/images/iptc_roundUp.jpg") as im:
|
||||
assert im.info["dpi"] == (44, 44)
|
||||
|
||||
# Round down
|
||||
with Image.open("Tests/images/iptc_roundDown.jpg") as im:
|
||||
assert im.info["dpi"] == (2, 2)
|
||||
|
||||
def test_save_dpi_rounding(self, tmp_path):
|
||||
outfile = str(tmp_path / "temp.jpg")
|
||||
with Image.open("Tests/images/hopper.jpg") as im:
|
||||
|
|
|
@ -386,25 +386,12 @@ class TestFilePng:
|
|||
# Check dpi roundtripping
|
||||
|
||||
with Image.open(TEST_PNG_FILE) as im:
|
||||
im = roundtrip(im, dpi=(100, 100))
|
||||
assert im.info["dpi"] == (100, 100)
|
||||
im = roundtrip(im, dpi=(100.33, 100.33))
|
||||
assert im.info["dpi"] == (100.33, 100.33)
|
||||
|
||||
def test_load_dpi_rounding(self):
|
||||
# Round up
|
||||
def test_load_float_dpi(self):
|
||||
with Image.open(TEST_PNG_FILE) as im:
|
||||
assert im.info["dpi"] == (96, 96)
|
||||
|
||||
# Round down
|
||||
with Image.open("Tests/images/icc_profile_none.png") as im:
|
||||
assert im.info["dpi"] == (72, 72)
|
||||
|
||||
def test_save_dpi_rounding(self):
|
||||
with Image.open(TEST_PNG_FILE) as im:
|
||||
im = roundtrip(im, dpi=(72.2, 72.2))
|
||||
assert im.info["dpi"] == (72, 72)
|
||||
|
||||
im = roundtrip(im, dpi=(72.8, 72.8))
|
||||
assert im.info["dpi"] == (73, 73)
|
||||
assert im.info["dpi"] == (95.9866, 95.9866)
|
||||
|
||||
def test_roundtrip_text(self):
|
||||
# Check text roundtripping
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#
|
||||
import array
|
||||
import io
|
||||
import math
|
||||
import os
|
||||
import struct
|
||||
import subprocess
|
||||
|
@ -162,15 +163,17 @@ def APP(self, marker):
|
|||
dpi = float(x_resolution[0]) / x_resolution[1]
|
||||
except TypeError:
|
||||
dpi = x_resolution
|
||||
if math.isnan(dpi):
|
||||
raise ValueError
|
||||
if resolution_unit == 3: # cm
|
||||
# 1 dpcm = 2.54 dpi
|
||||
dpi *= 2.54
|
||||
self.info["dpi"] = int(dpi + 0.5), int(dpi + 0.5)
|
||||
self.info["dpi"] = dpi, dpi
|
||||
except (KeyError, SyntaxError, ValueError, ZeroDivisionError):
|
||||
# SyntaxError for invalid/unreadable EXIF
|
||||
# KeyError for dpi not included
|
||||
# ZeroDivisionError for invalid dpi rational value
|
||||
# ValueError for x_resolution[0] being an invalid float
|
||||
# ValueError for dpi being an invalid float
|
||||
self.info["dpi"] = 72, 72
|
||||
|
||||
|
||||
|
|
|
@ -500,7 +500,7 @@ class PngStream(ChunkStream):
|
|||
px, py = i32(s, 0), i32(s, 4)
|
||||
unit = s[8]
|
||||
if unit == 1: # meter
|
||||
dpi = int(px * 0.0254 + 0.5), int(py * 0.0254 + 0.5)
|
||||
dpi = px * 0.0254, py * 0.0254
|
||||
self.im_info["dpi"] = dpi
|
||||
elif unit == 0:
|
||||
self.im_info["aspect"] = px, py
|
||||
|
|
Loading…
Reference in New Issue
Block a user