我相信在通过上下文菜单保存时,修改任务会更容易,而不需要特定的默认名称Save Image As...。例如,我们可以将作为数据 URL 呈现的图像打包到 HTML 链接中,并为后者提供参数download="произвольное_имя.png"。然后,当您用鼠标左键单击图片时,系统会提示您将链接(即图片作为数据 URL)保存为"произвольное_имя.png":
import numpy as np
from matplotlib import pyplot as plt
from IPython.display import display_html
from base64 import b64encode
from io import BytesIO
y = np.random.randn(100)
x = range(len(y))
data = BytesIO()
plt.plot(x, y)
plt.savefig(data)
plt.close() # не выводить график под ячейкой
img = f'data:image/png;base64,{b64encode(data.getvalue()).decode()}'
fname = 'graph_of_X_vs_Y.png'
hint = 'Left click to save' # подсказка при наведении мышки на картинку
msg = f'<a href="{img}" download="{fname}"><img src="{img}" title="{hint}"></a>'
display_html(msg, raw=True)
或者,我们可以将代码重写为过程:
def display_image(img, fname=None, hint="Left click to save"):
"""Show the given `img` picture in a notebook as a downlodable link
with `fname` a default file name to save as, and a `hint` message
to show when a mouse cursor is over the picture.
img: a file name as a string or `Path` or a file object with an image.
fname: a default name to use when saving the picture; if it's None
and `img` is a file name or a file object with a `name` attribute,
then the latter will be used as `fname`, otherwise some arbitrary
name will be supplied and image type detected if possible (image
type is supposed to be PNG by default; png, jpg, jpeg, webp can
be detected and displayed).
"""
from base64 import b64encode
from IPython.display import display_html
from io import BufferedIOBase
from pathlib import Path
from matplotlib import rcParams
DEFAULT_NAME = 'plot.%s'
DEFAULT_EXT = rcParams['savefig.format']
if isinstance(img, str) or isinstance(img, Path):
img = Path(img)
assert img.exists() and img.is_file(), "Path to an image isn't relevant"
if fname is None:
fname = img.name
with open(img, 'br') as f:
img = f.read()
elif isinstance(img, BufferedIOBase) and img.readable() and img.seekable():
img.seek(0)
if fname is None:
if isinstance(getattr(img, 'name', None), str):
fname = img.name
else:
try:
import imghdr # python>=3.13: pip install standard-imghdr
ext = imghdr.what(img) or DEFAULT_EXT
except ImportError:
ext = DEFAULT_EXT
fname = DEFAULT_NAME % ext
img = img.read()
else:
raise ValueError('Not supported image data')
img = f'data:image;base64,{b64encode(img).decode()}'
msg = f'<a href="{img}" download="{fname}"><img src="{img}" title="{hint}"></a>'
display_html(msg, raw=True)
然后屏幕上图表的显示可能如下所示:
import numpy as np
import matplotlib.pyplot as plt
y = np.random.randn(100)
x = range(len(y))
fname = 'plotXvsY.jpg'
plt.plot(x, y)
plt.savefig(fname)
plt.close()
display_image(fname)
在笔记本中,无论是 Jupyter Notebook 还是 Google Colab,图表都显示为Data URL。在该方案中,无法设置保存图片的默认名称。浏览器将尝试从Content-Disposition HTTP 标头或 URL 中提取名称。因此,为了解决这个问题,您需要将图片以给定的名称保存在可访问的在线资源上,并在记事本中显示它时使用它的访问地址。
我相信在通过上下文菜单保存时,修改任务会更容易,而不需要特定的默认名称Save Image As...。例如,我们可以将作为数据 URL 呈现的图像打包到 HTML 链接中,并为后者提供参数
download="произвольное_имя.png"。然后,当您用鼠标左键单击图片时,系统会提示您将链接(即图片作为数据 URL)保存为"произвольное_имя.png":或者,我们可以将代码重写为过程:
然后屏幕上图表的显示可能如下所示: