From f55ccd95630153026a41f85bea71dcbae25bb4ef Mon Sep 17 00:00:00 2001 From: Yutao Yuan Date: Mon, 9 Aug 2021 23:02:33 +0800 Subject: [PATCH 1/4] Remove stdout check in ImageFile._save --- src/PIL/ImageFile.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 43d2bf0cc1a..2a7febb2b7a 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -493,13 +493,6 @@ def _save(im, fp, tile, bufsize=0): # But, it would need at least the image size in most cases. RawEncode is # a tricky case. bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - try: - stdout = fp == sys.stdout or fp == sys.stdout.buffer - except (OSError, AttributeError): - stdout = False - if stdout: - fp.flush() - return try: fh = fp.fileno() fp.flush() From 0f11d22cceb1afcbde38496c7523af453730336e Mon Sep 17 00:00:00 2001 From: Yutao Yuan Date: Tue, 10 Aug 2021 17:56:52 +0800 Subject: [PATCH 2/4] Add tests for saving to stdout --- Tests/test_file_jpeg.py | 28 ++++++++++++++++++++++++++++ Tests/test_file_ppm.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 15518756c1c..da78e49112a 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1,5 +1,6 @@ import os import re +import sys from io import BytesIO import pytest @@ -870,6 +871,33 @@ def test_getxmp(self): with Image.open("Tests/images/hopper.jpg") as im: assert im.getxmp() == {} + @pytest.mark.parametrize("buffer", (True, False)) + def test_save_stdout(self, buffer): + old_stdout = sys.stdout + + if buffer: + + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout + + with Image.open(TEST_FILE) as im: + im.save(sys.stdout, "JPEG") + im_roundtrip = self.roundtrip(im) + + # Reset stdout + sys.stdout = old_stdout + + if buffer: + mystdout = mystdout.buffer + reloaded = Image.open(mystdout) + assert_image_equal(reloaded, im_roundtrip) + @pytest.mark.skipif(not is_win32(), reason="Windows only") @skip_unless_feature("jpg") diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index 0ccfb5e88c4..07c9bda849a 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -1,3 +1,6 @@ +import sys +from io import BytesIO + import pytest from PIL import Image @@ -80,3 +83,30 @@ def test_mimetypes(tmp_path): f.write("PyCMYK\n128 128\n255") with Image.open(path) as im: assert im.get_format_mimetype() == "image/x-portable-anymap" + + +@pytest.mark.parametrize("buffer", (True, False)) +def test_save_stdout(buffer): + old_stdout = sys.stdout + + if buffer: + + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout + + with Image.open(TEST_FILE) as im: + im.save(sys.stdout, "PPM") + + # Reset stdout + sys.stdout = old_stdout + + if buffer: + mystdout = mystdout.buffer + reloaded = Image.open(mystdout) + assert_image_equal_tofile(reloaded, TEST_FILE) From 1b397751ec35f6f2a64a73dd7cec4ccd4a04bb62 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Tue, 24 Aug 2021 23:43:38 +1000 Subject: [PATCH 3/4] Added context managers --- Tests/test_file_jpeg.py | 4 ++-- Tests/test_file_ppm.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index da78e49112a..5bd16e356aa 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -895,8 +895,8 @@ class MyStdOut: if buffer: mystdout = mystdout.buffer - reloaded = Image.open(mystdout) - assert_image_equal(reloaded, im_roundtrip) + with Image.open(mystdout) as reloaded: + assert_image_equal(reloaded, im_roundtrip) @pytest.mark.skipif(not is_win32(), reason="Windows only") diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py index 07c9bda849a..ad36319db27 100644 --- a/Tests/test_file_ppm.py +++ b/Tests/test_file_ppm.py @@ -108,5 +108,5 @@ class MyStdOut: if buffer: mystdout = mystdout.buffer - reloaded = Image.open(mystdout) - assert_image_equal_tofile(reloaded, TEST_FILE) + with Image.open(mystdout) as reloaded: + assert_image_equal_tofile(reloaded, TEST_FILE) From 3a302f3e4b941f3336d9a7d8d4c1fbbb40c6b8ff Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Thu, 25 Nov 2021 23:33:59 +1100 Subject: [PATCH 4/4] Only add test to PPM --- Tests/test_file_jpeg.py | 28 ---------------------------- 1 file changed, 28 deletions(-) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py index 5bd16e356aa..15518756c1c 100644 --- a/Tests/test_file_jpeg.py +++ b/Tests/test_file_jpeg.py @@ -1,6 +1,5 @@ import os import re -import sys from io import BytesIO import pytest @@ -871,33 +870,6 @@ def test_getxmp(self): with Image.open("Tests/images/hopper.jpg") as im: assert im.getxmp() == {} - @pytest.mark.parametrize("buffer", (True, False)) - def test_save_stdout(self, buffer): - old_stdout = sys.stdout - - if buffer: - - class MyStdOut: - buffer = BytesIO() - - mystdout = MyStdOut() - else: - mystdout = BytesIO() - - sys.stdout = mystdout - - with Image.open(TEST_FILE) as im: - im.save(sys.stdout, "JPEG") - im_roundtrip = self.roundtrip(im) - - # Reset stdout - sys.stdout = old_stdout - - if buffer: - mystdout = mystdout.buffer - with Image.open(mystdout) as reloaded: - assert_image_equal(reloaded, im_roundtrip) - @pytest.mark.skipif(not is_win32(), reason="Windows only") @skip_unless_feature("jpg")