diff --git a/src/PIL/ImageGrab.py b/src/PIL/ImageGrab.py index 1ab34ad5791..36e53fa9ee9 100644 --- a/src/PIL/ImageGrab.py +++ b/src/PIL/ImageGrab.py @@ -170,8 +170,8 @@ def grabclipboard() -> Image.Image | list[str] | None: data = io.BytesIO(binascii.unhexlify(p.stdout[11:-3])) return Image.open(data) elif sys.platform == "win32": - fmt, data = Image.core.grabclipboard_win32() - if fmt == "file": # CF_HDROP + format_name, data = Image.core.grabclipboard_win32() + if format_name == "file": # CF_HDROP import struct o = struct.unpack_from("I", data)[0] @@ -180,16 +180,8 @@ def grabclipboard() -> Image.Image | list[str] | None: else: files = data[o:].decode("utf-16le").split("\0") return files[: files.index("")] - if isinstance(data, bytes): - data = io.BytesIO(data) - if fmt == "png": - from . import PngImagePlugin - - return PngImagePlugin.PngImageFile(data) - elif fmt == "DIB": - from . import BmpImagePlugin - - return BmpImagePlugin.DibImageFile(data) + if format_name in {"DIB", "PNG"}: + return Image.open(io.BytesIO(data), formats=[format_name]) return None else: if os.getenv("WAYLAND_DISPLAY"): diff --git a/src/display.c b/src/display.c index 32b3408d83c..195142d465e 100644 --- a/src/display.c +++ b/src/display.c @@ -461,8 +461,10 @@ PyImaging_GrabClipboardWin32(PyObject *self, PyObject *args) { void *data; PyObject *result; UINT format; + // Windows clipboard format identifiers UINT formats[] = {CF_DIB, CF_DIBV5, CF_HDROP, RegisterClipboardFormatA("PNG"), 0}; - LPCSTR format_names[] = {"DIB", "DIB", "file", "png", NULL}; + // For format_name in ImageGrab.py, in the same order as the formats above + LPCSTR format_names[] = {"DIB", "DIB", "file", "PNG", NULL}; if (!OpenClipboard(NULL)) { // Maybe the clipboard is temporarily in use by another process.