diff --git a/Tests/images/tiny.png b/Tests/images/tiny.png new file mode 100644 index 00000000000..3d9ff56e7ef Binary files /dev/null and b/Tests/images/tiny.png differ diff --git a/Tests/test_image_convert.py b/Tests/test_image_convert.py index 96587e4e2fa..e5639e10533 100644 --- a/Tests/test_image_convert.py +++ b/Tests/test_image_convert.py @@ -222,6 +222,20 @@ def test_p_la(): assert_image_similar(alpha, comparable, 5) +def test_p2pa_alpha(): + with Image.open("Tests/images/tiny.png") as im: + assert im.mode == "P" + + im_pa = im.convert("PA") + assert im_pa.mode == "PA" + + im_a = im_pa.getchannel("A") + for x in range(4): + alpha = 255 if x > 1 else 0 + for y in range(4): + assert im_a.getpixel((x, y)) == alpha + + def test_matrix_illegal_conversion(): # Arrange im = hopper("CMYK") diff --git a/src/libImaging/Convert.c b/src/libImaging/Convert.c index ba57deca192..5dc17db60d0 100644 --- a/src/libImaging/Convert.c +++ b/src/libImaging/Convert.c @@ -1031,7 +1031,7 @@ p2pa(UINT8 *out, const UINT8 *in, int xsize, ImagingPalette palette) { int x; int rgb = strcmp(palette->mode, "RGB"); for (x = 0; x < xsize; x++, in++) { - const UINT8 *rgba = &palette->palette[in[0]]; + const UINT8 *rgba = &palette->palette[in[0] * 4]; *out++ = in[0]; *out++ = in[0]; *out++ = in[0];