diff --git a/doc/api/next_api_changes/deprecations/18649-TH.rst b/doc/api/next_api_changes/deprecations/18649-TH.rst new file mode 100644 index 000000000000..7d73d9bbe362 --- /dev/null +++ b/doc/api/next_api_changes/deprecations/18649-TH.rst @@ -0,0 +1,7 @@ +``imread()`` reading from URLs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Passing a URL to `~.pyplot.imread()` is deprecated. Please open the URL for +reading and directly use the Pillow API +(``PIL.Image.open(urllib.request.urlopen(url))``, or +``PIL.Image.open(io.BytesIO(requests.get(url).content))``) instead. diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index a155d6472aee..14b3f78f703b 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -1430,6 +1430,10 @@ def imread(fname, format=None): fname : str or file-like The image file to read: a filename, a URL or a file-like object opened in read-binary mode. + + Passing a URL is deprecated. Please open the URL + for reading and pass the result to Pillow, e.g. with + ``PIL.Image.open(urllib.request.urlopen(url))``. format : str, optional The image file format assumed for reading the data. If not given, the format is deduced from the filename. If nothing can @@ -1472,9 +1476,13 @@ def imread(fname, format=None): img_open = ( PIL.PngImagePlugin.PngImageFile if ext == 'png' else PIL.Image.open) if isinstance(fname, str): - parsed = parse.urlparse(fname) if len(parsed.scheme) > 1: # Pillow doesn't handle URLs directly. + cbook.warn_deprecated( + "3.4", message="Directly reading images from URLs is " + "deprecated. Please open the URL for reading and pass the " + "result to Pillow, e.g. with " + "``PIL.Image.open(urllib.request.urlopen(url))``.") # hide imports to speed initial import on systems with slow linkers from urllib import request ssl_ctx = mpl._get_ssl_context() diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 6486fcf84e6f..9657968de7eb 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -12,7 +12,7 @@ from PIL import Image from matplotlib import ( - colors, image as mimage, patches, pyplot as plt, style, rcParams) + _api, colors, image as mimage, patches, pyplot as plt, style, rcParams) from matplotlib.image import (AxesImage, BboxImage, FigureImage, NonUniformImage, PcolorImage) from matplotlib.testing.decorators import check_figures_equal, image_comparison @@ -714,7 +714,8 @@ def test_load_from_url(): url = ('file:' + ('///' if sys.platform == 'win32' else '') + path.resolve().as_posix()) - plt.imread(url) + with _api.suppress_matplotlib_deprecation_warning(): + plt.imread(url) with urllib.request.urlopen(url) as file: plt.imread(file) @@ -1128,7 +1129,8 @@ def test_exact_vmin(): @pytest.mark.network @pytest.mark.flaky def test_https_imread_smoketest(): - v = mimage.imread('https://matplotlib.org/1.5.0/_static/logo2.png') + with _api.suppress_matplotlib_deprecation_warning(): + v = mimage.imread('https://matplotlib.org/1.5.0/_static/logo2.png') # A basic ndarray subclass that implements a quantity