Pillow/Tests/test_file_wmf.py
Andrew Murray cbc55c4621
Raise ValueError when WMF inch is zero (#8600)
Co-authored-by: Andrew Murray <radarhere@users.noreply.github.com>
2024-12-18 08:08:51 +02:00

97 lines
2.8 KiB
Python

from __future__ import annotations
from io import BytesIO
from pathlib import Path
from typing import IO
import pytest
from PIL import Image, ImageFile, WmfImagePlugin
from .helper import assert_image_similar_tofile, hopper
def test_load_raw() -> None:
# Test basic EMF open and rendering
with Image.open("Tests/images/drawing.emf") as im:
if hasattr(Image.core, "drawwmf"):
# Currently, support for WMF/EMF is Windows-only
im.load()
# Compare to reference rendering
assert_image_similar_tofile(im, "Tests/images/drawing_emf_ref.png", 0)
# Test basic WMF open and rendering
with Image.open("Tests/images/drawing.wmf") as im:
if hasattr(Image.core, "drawwmf"):
# Currently, support for WMF/EMF is Windows-only
im.load()
# Compare to reference rendering
assert_image_similar_tofile(im, "Tests/images/drawing_wmf_ref.png", 2.0)
def test_load() -> None:
with Image.open("Tests/images/drawing.emf") as im:
if hasattr(Image.core, "drawwmf"):
assert im.load()[0, 0] == (255, 255, 255)
def test_load_zero_inch() -> None:
b = BytesIO(b"\xd7\xcd\xc6\x9a\x00\x00" + b"\x00" * 10)
with pytest.raises(ValueError):
with Image.open(b):
pass
def test_register_handler(tmp_path: Path) -> None:
class TestHandler(ImageFile.StubHandler):
methodCalled = False
def load(self, im: ImageFile.StubImageFile) -> Image.Image:
return Image.new("RGB", (1, 1))
def save(self, im: Image.Image, fp: IO[bytes], filename: str) -> None:
self.methodCalled = True
handler = TestHandler()
original_handler = WmfImagePlugin._handler
WmfImagePlugin.register_handler(handler)
im = hopper()
tmpfile = str(tmp_path / "temp.wmf")
im.save(tmpfile)
assert handler.methodCalled
# Restore the state before this test
WmfImagePlugin.register_handler(original_handler)
def test_load_float_dpi() -> None:
with Image.open("Tests/images/drawing.emf") as im:
assert im.info["dpi"] == 1423.7668161434979
with open("Tests/images/drawing.emf", "rb") as fp:
data = fp.read()
b = BytesIO(data[:8] + b"\x06\xFA" + data[10:])
with Image.open(b) as im:
assert im.info["dpi"][0] == 2540
def test_load_set_dpi() -> None:
with Image.open("Tests/images/drawing.wmf") as im:
assert im.size == (82, 82)
if hasattr(Image.core, "drawwmf"):
im.load(144)
assert im.size == (164, 164)
assert_image_similar_tofile(im, "Tests/images/drawing_wmf_ref_144.png", 2.1)
@pytest.mark.parametrize("ext", (".wmf", ".emf"))
def test_save(ext: str, tmp_path: Path) -> None:
im = hopper()
tmpfile = str(tmp_path / ("temp" + ext))
with pytest.raises(OSError):
im.save(tmpfile)