diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 6ab2075fd5a2..c1da65347055 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -489,16 +489,31 @@ def _make_image(self, A, in_bbox, out_bbox, clip_bbox, magnification=1.0, .format(A.shape)) output = np.zeros((out_height, out_width, 4), dtype=A.dtype) + output_a = np.zeros((out_height, out_width), dtype=A.dtype) alpha = self.get_alpha() if alpha is None: - alpha = 1.0 + alpha = 1 + + #resample alpha channel + alpha_channel = A[..., 3] + _image.resample( + alpha_channel, output_a, t, + _interpd_[self.get_interpolation()], + self.get_resample(), alpha, + self.get_filternorm(), self.get_filterrad()) + #resample rgb channels + A = _rgb_to_rgba(A[..., :3]) _image.resample( - A, output, t, _interpd_[self.get_interpolation()], + A, output, t, + _interpd_[self.get_interpolation()], self.get_resample(), alpha, self.get_filternorm(), self.get_filterrad()) + #recombine rgb and alpha channels + output[..., 3] = output_a + # at this point output is either a 2D array of normed data # (of int or float) # or an RGBA array of re-sampled input diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.pdf b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.pdf index 0296c436194a..e7d205bfa8e0 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.pdf and b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.pdf differ diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.png b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.png index ba2a4b31e8fd..c9e9f343c5db 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.png and b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.svg b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.svg index aed9e22312ed..7f1678715ba3 100644 --- a/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.svg +++ b/lib/matplotlib/tests/baseline_images/test_image/image_composite_alpha.svg @@ -1,7 +1,7 @@ - + - + +" id="mc63e59a608" style="stroke:#000000;stroke-width:0.5;"/> - + - + - + - + - + - + - + - + - + - + - + @@ -140,80 +140,80 @@ L 0 4 +" id="m556f96d829" style="stroke:#000000;stroke-width:0.5;"/> - + +" id="m27e32ca04a" style="stroke:#000000;stroke-width:0.5;"/> - + - + - + - + - + - + - + - + - + - + - + @@ -221,13 +221,8 @@ L -4 0 - - + + diff --git a/lib/matplotlib/tests/baseline_images/test_image/interp_alpha.png b/lib/matplotlib/tests/baseline_images/test_image/interp_alpha.png new file mode 100644 index 000000000000..5679a2f97df8 Binary files /dev/null and b/lib/matplotlib/tests/baseline_images/test_image/interp_alpha.png differ diff --git a/lib/matplotlib/tests/baseline_images/test_png/pngsuite.png b/lib/matplotlib/tests/baseline_images/test_png/pngsuite.png index 79abf893f320..d97265215a4c 100644 Binary files a/lib/matplotlib/tests/baseline_images/test_png/pngsuite.png and b/lib/matplotlib/tests/baseline_images/test_png/pngsuite.png differ diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index a6d08ba61929..3449678b35e2 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -45,6 +45,20 @@ def test_image_interps(): ax3.set_ylabel('bicubic') +@image_comparison(baseline_images=['interp_alpha'], + extensions=['png'], remove_text=True) +def test_alpha_interp(): + 'Test the interpolation of the alpha channel on RGBA images' + fig, (axl, axr) = plt.subplots(1, 2) + # full green image + img = np.zeros((5, 5, 4)) + img[..., 1] = np.ones((5, 5)) + # transparent under main diagonal + img[..., 3] = np.tril(np.ones((5, 5), dtype=np.uint8)) + axl.imshow(img, interpolation="none") + axr.imshow(img, interpolation="bilinear") + + @image_comparison(baseline_images=['interp_nearest_vs_none'], extensions=['pdf', 'svg'], remove_text=True) def test_interp_nearest_vs_none():