diff --git a/skimage/data/foo3x5x4indexed.png b/skimage/data/foo3x5x4indexed.png new file mode 100644 index 00000000..cc969d03 Binary files /dev/null and b/skimage/data/foo3x5x4indexed.png differ diff --git a/skimage/io/_plugins/pil_plugin.py b/skimage/io/_plugins/pil_plugin.py index 7cb8e5c1..59811dd2 100644 --- a/skimage/io/_plugins/pil_plugin.py +++ b/skimage/io/_plugins/pil_plugin.py @@ -85,7 +85,10 @@ def pil_to_ndarray(im, dtype=None, img_num=None): if grayscale: frame = im.convert('L') else: - frame = im.convert('RGB') + if im.format == 'PNG' and 'transparency' in im.info: + frame = im.convert('RGBA') + else: + frame = im.convert('RGB') elif im.mode == '1': frame = im.convert('L') diff --git a/skimage/io/tests/test_pil.py b/skimage/io/tests/test_pil.py index ad3870a6..ee962906 100644 --- a/skimage/io/tests/test_pil.py +++ b/skimage/io/tests/test_pil.py @@ -84,6 +84,28 @@ def test_imread_palette(): assert img.ndim == 3 +def test_imread_index_png_with_alpha(): + # The file `foo3x5x4indexed.png` was created with this array + # (3x5 is (height)x(width)): + data = np.array([[[127, 0, 255, 255], + [127, 0, 255, 255], + [127, 0, 255, 255], + [127, 0, 255, 255], + [127, 0, 255, 255]], + [[192, 192, 255, 0], + [192, 192, 255, 0], + [0, 0, 255, 0], + [0, 0, 255, 0], + [0, 0, 255, 0]], + [[0, 31, 255, 255], + [0, 31, 255, 255], + [0, 31, 255, 255], + [0, 31, 255, 255], + [0, 31, 255, 255]]], dtype=np.uint8) + img = imread(os.path.join(data_dir, 'foo3x5x4indexed.png')) + assert_array_equal(img, data) + + def test_palette_is_gray(): gray = Image.open(os.path.join(data_dir, 'palette_gray.png')) assert _palette_is_grayscale(gray)