diff --git a/Tests/test_image_getpixel.py b/Tests/test_image_getpixel.py index ffa6a9c52..67f5904a2 100644 --- a/Tests/test_image_getpixel.py +++ b/Tests/test_image_getpixel.py @@ -11,49 +11,39 @@ def color(mode): else: return tuple(range(1, bands+1)) -def test_pixel(): - def pixel(mode): + +def check(mode, c=None): + if not c: c = color(mode) - im = Image.new(mode, (1, 1), None) - im.putpixel((0, 0), c) - return im.getpixel((0, 0)) + + #check putpixel + im = Image.new(mode, (1, 1), None) + im.putpixel((0, 0), c) + assert_equal(im.getpixel((0, 0)), c, + "put/getpixel roundtrip failed for mode %s, color %s" % + (mode, c)) + + # check inital color + im = Image.new(mode, (1, 1), c) + assert_equal(im.getpixel((0, 0)), c, + "initial color failed for mode %s, color %s " % + (mode, color)) - assert_equal(pixel("1"), 1) - assert_equal(pixel("L"), 1) - assert_equal(pixel("LA"), (1, 2)) - assert_equal(pixel("I"), 1) - assert_equal(pixel("I;16"), 1) - assert_equal(pixel("I;16B"), 1) - assert_equal(pixel("F"), 1.0) - assert_equal(pixel("P"), 1) - assert_equal(pixel("PA"), (1, 2)) - assert_equal(pixel("RGB"), (1, 2, 3)) - assert_equal(pixel("RGBA"), (1, 2, 3, 4)) - assert_equal(pixel("RGBX"), (1, 2, 3, 4)) - assert_equal(pixel("CMYK"), (1, 2, 3, 4)) - assert_equal(pixel("YCbCr"), (1, 2, 3)) +def test_basic(): + for mode in ("1", "L", "LA", "I", "I;16", "I;16B", "F", + "P", "PA", "RGB", "RGBA", "RGBX", "CMYK","YCbCr"): + check(mode) -def test_image(): - - def pixel(mode): - im = Image.new(mode, (1, 1), color(mode)) - return im.getpixel((0, 0)) - - assert_equal(pixel("1"), 1) - assert_equal(pixel("L"), 1) - assert_equal(pixel("LA"), (1, 2)) - assert_equal(pixel("I"), 1) - assert_equal(pixel("I;16"), 1) - assert_equal(pixel("I;16B"), 1) - assert_equal(pixel("F"), 1.0) - assert_equal(pixel("P"), 1) - assert_equal(pixel("PA"), (1, 2)) - assert_equal(pixel("RGB"), (1, 2, 3)) - assert_equal(pixel("RGBA"), (1, 2, 3, 4)) - assert_equal(pixel("RGBX"), (1, 2, 3, 4)) - assert_equal(pixel("CMYK"), (1, 2, 3, 4)) - assert_equal(pixel("YCbCr"), (1, 2, 3)) +def test_signedness(): + # see https://github.com/python-imaging/Pillow/issues/452 + # pixelaccess is using signed int* instead of uint* + for mode in ("I;16", "I;16B"): + check(mode, 2**15-1) + check(mode, 2**15) + check(mode, 2**15+1) + check(mode, 2**16-1) + diff --git a/_imaging.c b/_imaging.c index 13466f00a..078961da4 100644 --- a/_imaging.c +++ b/_imaging.c @@ -463,7 +463,7 @@ getpixel(Imaging im, ImagingAccess access, int x, int y) { union { UINT8 b[4]; - INT16 h; + UINT16 h; INT32 i; FLOAT32 f; } pixel; diff --git a/libImaging/Access.c b/libImaging/Access.c index 70eb1af4c..62c97f3a3 100644 --- a/libImaging/Access.c +++ b/libImaging/Access.c @@ -94,11 +94,11 @@ static void get_pixel_16L(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x+x]; - INT16* out = color; + UINT16* out = color; #ifdef WORDS_BIGENDIAN out[0] = in[0] + (in[1]<<8); #else - out[0] = *(INT16*) in; + out[0] = *(UINT16*) in; #endif } @@ -106,9 +106,9 @@ static void get_pixel_16B(Imaging im, int x, int y, void* color) { UINT8* in = (UINT8*) &im->image[y][x+x]; - INT16* out = color; + UINT16* out = color; #ifdef WORDS_BIGENDIAN - out[0] = *(INT16*) in; + out[0] = *(UINT16*) in; #else out[0] = in[1] + (in[0]<<8); #endif