Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 39d84d7

Browse files
committed
Reuse png metadata handling of imsave() in FigureCanvasAgg.print_png().
This avoids duplicating the conversion of metadata to PngInfo and revealed a bug in the priority between `metadata` and `pil_kwargs` in imsave(). Note that because `np.asarray(self.buffer_rgba())` is already a RGBA uint8 array, there is no colormapping step happening in imsave(). Ideally mplcairo should also be able to use imsave() for saving to png.
1 parent ce334d4 commit 39d84d7

File tree

2 files changed

+9
-15
lines changed

2 files changed

+9
-15
lines changed

lib/matplotlib/backends/backend_agg.py

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@
3131

3232
import numpy as np
3333
from PIL import Image
34-
from PIL.PngImagePlugin import PngInfo
3534

35+
import matplotlib as mpl
3636
from matplotlib import cbook, rcParams, __version__
3737
from matplotlib.backend_bases import (
3838
_Backend, FigureCanvasBase, FigureManagerBase, RendererBase)
@@ -503,24 +503,16 @@ def print_png(self, filename_or_obj, *args,
503503

504504
if metadata is None:
505505
metadata = {}
506-
if pil_kwargs is None:
507-
pil_kwargs = {}
508506
metadata = {
509507
"Software":
510508
f"matplotlib version{__version__}, http://matplotlib.org/",
511509
**metadata,
512510
}
513511
FigureCanvasAgg.draw(self)
514-
# Only use the metadata kwarg if pnginfo is not set, because the
515-
# semantics of duplicate keys in pnginfo is unclear.
516-
if "pnginfo" not in pil_kwargs:
517-
pnginfo = PngInfo()
518-
for k, v in metadata.items():
519-
pnginfo.add_text(k, v)
520-
pil_kwargs["pnginfo"] = pnginfo
521-
pil_kwargs.setdefault("dpi", (self.figure.dpi, self.figure.dpi))
522-
(Image.fromarray(np.asarray(self.buffer_rgba()))
523-
.save(filename_or_obj, format="png", **pil_kwargs))
512+
mpl.image.imsave(
513+
filename_or_obj, np.asarray(self.buffer_rgba()), format="png",
514+
origin="upper", dpi=self.figure.dpi,
515+
metadata=metadata, pil_kwargs=pil_kwargs)
524516

525517
def print_to_buffer(self):
526518
FigureCanvasAgg.draw(self)

lib/matplotlib/image.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,8 +1509,10 @@ def imsave(fname, arr, vmin=None, vmax=None, cmap=None, format=None,
15091509
pil_shape = (rgba.shape[1], rgba.shape[0])
15101510
image = PIL.Image.frombuffer(
15111511
"RGBA", pil_shape, rgba, "raw", "RGBA", 0, 1)
1512-
if format == "png" and metadata is not None:
1513-
# cf. backend_agg's print_png.
1512+
if (format == "png"
1513+
and metadata is not None and "pnginfo" not in pil_kwargs):
1514+
# Only use the metadata kwarg if pnginfo is not set, because the
1515+
# semantics of duplicate keys in pnginfo is unclear.
15141516
pnginfo = PIL.PngImagePlugin.PngInfo()
15151517
for k, v in metadata.items():
15161518
pnginfo.add_text(k, v)

0 commit comments

Comments
 (0)