From 94675048e516e3de504990f748a38e49662430ac Mon Sep 17 00:00:00 2001 From: "Albert Y. Shih" Date: Mon, 7 Sep 2026 01:45:26 -0400 Subject: [PATCH] Fix bug of passing a rendered image with premultiplied alpha --- lib/matplotlib/backends/backend_tkcairo.py | 10 ++++------ lib/matplotlib/cbook.py | 2 ++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/backends/backend_tkcairo.py b/lib/matplotlib/backends/backend_tkcairo.py index 6ecfcfcb8cf0..cb69ab2102ca 100644 --- a/lib/matplotlib/backends/backend_tkcairo.py +++ b/lib/matplotlib/backends/backend_tkcairo.py @@ -1,7 +1,6 @@ -import sys - import numpy as np +from .. import cbook from . import _backend_tk from .backend_cairo import cairo, FigureCanvasCairo from ._backend_tk import _BackendTk, FigureCanvasTk @@ -14,10 +13,9 @@ def draw(self): self._renderer.set_context(cairo.Context(surface)) self._renderer.dpi = self.figure.dpi self.figure.draw(self._renderer) - buf = np.reshape(surface.get_data(), (height, width, 4)) - _backend_tk.blit( - self._tkphoto, buf, - (2, 1, 0, 3) if sys.byteorder == "little" else (1, 2, 3, 0)) + premult_argb = np.reshape(surface.get_data(), (height, width, 4)) + unmult_rgba = cbook._premultiplied_argb32_to_unmultiplied_rgba8888(premult_argb) + _backend_tk.blit(self._tkphoto, unmult_rgba, (0, 1, 2, 3)) @_BackendTk.export diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index b3f90487ce79..3d49c0819257 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -2210,6 +2210,8 @@ def _premultiplied_argb32_to_unmultiplied_rgba8888(buf): [2, 1, 0, 3] if sys.byteorder == "little" else [1, 2, 3, 0], axis=2) rgb = rgba[..., :-1] alpha = rgba[..., -1] + if alpha.min() == 0xff: + return rgba # Un-premultiply alpha. The formula is the same as in cairo-png.c. mask = alpha != 0 for channel in np.rollaxis(rgb, -1):