From ad784eb8080b653ed9a28b4d03195d379b2d0538 Mon Sep 17 00:00:00 2001 From: Brian Crowell Date: Mon, 15 Oct 2012 15:26:38 -0500 Subject: [PATCH] py3k: Import Christoph Gohlke's test suite This is Christoph Gohlke's test suite from his personal PIL package found at http://www.lfd.uci.edu/~gohlke/pythonlibs/. This is just to bring it in as a separate commit. Future commits will align it with Pillow. --- Tests/README.txt | 4 + Tests/bench_get.py | 20 +++ Tests/cms_test.py | 222 +++++++++++++++++++++++++++++ Tests/crash_ttf_memory_error.py | 14 ++ Tests/fonts/helvO18.pcf | Bin 0 -> 78412 bytes Tests/icc/CMY.icm | Bin 0 -> 101936 bytes Tests/icc/YCC709.icm | Bin 0 -> 101940 bytes Tests/icc/sRGB.icm | Bin 0 -> 3144 bytes Tests/images/broken.png | 5 + Tests/images/caption_6_33_22.png | Bin 0 -> 15378 bytes Tests/images/pil123p.png | Bin 0 -> 12901 bytes Tests/images/pil123rgba.png | Bin 0 -> 28353 bytes Tests/images/pil136.tiff | Bin 0 -> 9654 bytes Tests/images/pil168.tif | Bin 0 -> 5757 bytes Tests/images/pil184.pcx | Bin 0 -> 5364 bytes Tests/images/pil_sample_cmyk.jpg | Bin 0 -> 29364 bytes Tests/images/pil_sample_rgb.jpg | Bin 0 -> 29342 bytes Tests/images/rgb.jpg | Bin 0 -> 20230 bytes Tests/import_all.py | 13 ++ Tests/make_hash.py | 57 ++++++++ Tests/run.py | 93 ++++++++++++ Tests/show_icc.py | 28 ++++ Tests/show_mcidas.py | 26 ++++ Tests/test_000_sanity.py | 21 +++ Tests/test_001_archive.py | 23 +++ Tests/test_contents.py | 31 ++++ Tests/test_file_bmp.py | 27 ++++ Tests/test_file_gif.py | 28 ++++ Tests/test_file_jpeg.py | 179 +++++++++++++++++++++++ Tests/test_file_msp.py | 15 ++ Tests/test_file_pcx.py | 39 +++++ Tests/test_file_png.py | 170 ++++++++++++++++++++++ Tests/test_file_ppm.py | 14 ++ Tests/test_file_tiff.py | 57 ++++++++ Tests/test_file_xbm.py | 34 +++++ Tests/test_font_bdf.py | 13 ++ Tests/test_font_pcf.py | 26 ++++ Tests/test_image.py | 39 +++++ Tests/test_image_array.py | 33 +++++ Tests/test_image_convert.py | 26 ++++ Tests/test_image_copy.py | 12 ++ Tests/test_image_crop.py | 52 +++++++ Tests/test_image_draft.py | 25 ++++ Tests/test_image_filter.py | 82 +++++++++++ Tests/test_image_fromstring.py | 11 ++ Tests/test_image_getbands.py | 15 ++ Tests/test_image_getbbox.py | 36 +++++ Tests/test_image_getcolors.py | 64 +++++++++ Tests/test_image_getdata.py | 28 ++++ Tests/test_image_getextrema.py | 17 +++ Tests/test_image_getim.py | 13 ++ Tests/test_image_getpalette.py | 19 +++ Tests/test_image_getpixel.py | 57 ++++++++ Tests/test_image_getprojection.py | 30 ++++ Tests/test_image_histogram.py | 19 +++ Tests/test_image_load.py | 11 ++ Tests/test_image_mode.py | 27 ++++ Tests/test_image_offset.py | 16 +++ Tests/test_image_paste.py | 5 + Tests/test_image_point.py | 19 +++ Tests/test_image_putalpha.py | 43 ++++++ Tests/test_image_putdata.py | 40 ++++++ Tests/test_image_putpalette.py | 28 ++++ Tests/test_image_putpixel.py | 43 ++++++ Tests/test_image_quantize.py | 15 ++ Tests/test_image_resize.py | 12 ++ Tests/test_image_rotate.py | 15 ++ Tests/test_image_save.py | 5 + Tests/test_image_seek.py | 5 + Tests/test_image_show.py | 5 + Tests/test_image_split.py | 42 ++++++ Tests/test_image_tell.py | 5 + Tests/test_image_thumbnail.py | 36 +++++ Tests/test_image_tobitmap.py | 15 ++ Tests/test_image_tostring.py | 8 ++ Tests/test_image_transform.py | 5 + Tests/test_image_transpose.py | 34 +++++ Tests/test_image_verify.py | 5 + Tests/test_imagechops.py | 56 ++++++++ Tests/test_imagecms.py | 82 +++++++++++ Tests/test_imagecolor.py | 31 ++++ Tests/test_imagedraw.py | 28 ++++ Tests/test_imageenhance.py | 19 +++ Tests/test_imagefile.py | 61 ++++++++ Tests/test_imagefileio.py | 24 ++++ Tests/test_imagefilter.py | 31 ++++ Tests/test_imagefont.py | 12 ++ Tests/test_imagegl.py | 9 ++ Tests/test_imagegrab.py | 13 ++ Tests/test_imagemath.py | 62 ++++++++ Tests/test_imagemode.py | 23 +++ Tests/test_imageops.py | 70 +++++++++ Tests/test_imageops_usm.py | 55 +++++++ Tests/test_imagepalette.py | 44 ++++++ Tests/test_imagepath.py | 49 +++++++ Tests/test_imageqt.py | 9 ++ Tests/test_imagesequence.py | 22 +++ Tests/test_imageshow.py | 6 + Tests/test_imagestat.py | 52 +++++++ Tests/test_imagetk.py | 9 ++ Tests/test_imagetransform.py | 18 +++ Tests/test_imagewin.py | 6 + Tests/test_lib_image.py | 30 ++++ Tests/test_lib_pack.py | 110 ++++++++++++++ Tests/test_mode_i16.py | 103 ++++++++++++++ Tests/test_numpy.py | 54 +++++++ Tests/tester.py | 229 ++++++++++++++++++++++++++++++ Tests/threaded_save.py | 56 ++++++++ Tests/versions.py | 23 +++ 109 files changed, 3572 insertions(+) create mode 100644 Tests/README.txt create mode 100644 Tests/bench_get.py create mode 100644 Tests/cms_test.py create mode 100644 Tests/crash_ttf_memory_error.py create mode 100644 Tests/fonts/helvO18.pcf create mode 100644 Tests/icc/CMY.icm create mode 100644 Tests/icc/YCC709.icm create mode 100644 Tests/icc/sRGB.icm create mode 100644 Tests/images/broken.png create mode 100644 Tests/images/caption_6_33_22.png create mode 100644 Tests/images/pil123p.png create mode 100644 Tests/images/pil123rgba.png create mode 100644 Tests/images/pil136.tiff create mode 100644 Tests/images/pil168.tif create mode 100644 Tests/images/pil184.pcx create mode 100644 Tests/images/pil_sample_cmyk.jpg create mode 100644 Tests/images/pil_sample_rgb.jpg create mode 100644 Tests/images/rgb.jpg create mode 100644 Tests/import_all.py create mode 100644 Tests/make_hash.py create mode 100644 Tests/run.py create mode 100644 Tests/show_icc.py create mode 100644 Tests/show_mcidas.py create mode 100644 Tests/test_000_sanity.py create mode 100644 Tests/test_001_archive.py create mode 100644 Tests/test_contents.py create mode 100644 Tests/test_file_bmp.py create mode 100644 Tests/test_file_gif.py create mode 100644 Tests/test_file_jpeg.py create mode 100644 Tests/test_file_msp.py create mode 100644 Tests/test_file_pcx.py create mode 100644 Tests/test_file_png.py create mode 100644 Tests/test_file_ppm.py create mode 100644 Tests/test_file_tiff.py create mode 100644 Tests/test_file_xbm.py create mode 100644 Tests/test_font_bdf.py create mode 100644 Tests/test_font_pcf.py create mode 100644 Tests/test_image.py create mode 100644 Tests/test_image_array.py create mode 100644 Tests/test_image_convert.py create mode 100644 Tests/test_image_copy.py create mode 100644 Tests/test_image_crop.py create mode 100644 Tests/test_image_draft.py create mode 100644 Tests/test_image_filter.py create mode 100644 Tests/test_image_fromstring.py create mode 100644 Tests/test_image_getbands.py create mode 100644 Tests/test_image_getbbox.py create mode 100644 Tests/test_image_getcolors.py create mode 100644 Tests/test_image_getdata.py create mode 100644 Tests/test_image_getextrema.py create mode 100644 Tests/test_image_getim.py create mode 100644 Tests/test_image_getpalette.py create mode 100644 Tests/test_image_getpixel.py create mode 100644 Tests/test_image_getprojection.py create mode 100644 Tests/test_image_histogram.py create mode 100644 Tests/test_image_load.py create mode 100644 Tests/test_image_mode.py create mode 100644 Tests/test_image_offset.py create mode 100644 Tests/test_image_paste.py create mode 100644 Tests/test_image_point.py create mode 100644 Tests/test_image_putalpha.py create mode 100644 Tests/test_image_putdata.py create mode 100644 Tests/test_image_putpalette.py create mode 100644 Tests/test_image_putpixel.py create mode 100644 Tests/test_image_quantize.py create mode 100644 Tests/test_image_resize.py create mode 100644 Tests/test_image_rotate.py create mode 100644 Tests/test_image_save.py create mode 100644 Tests/test_image_seek.py create mode 100644 Tests/test_image_show.py create mode 100644 Tests/test_image_split.py create mode 100644 Tests/test_image_tell.py create mode 100644 Tests/test_image_thumbnail.py create mode 100644 Tests/test_image_tobitmap.py create mode 100644 Tests/test_image_tostring.py create mode 100644 Tests/test_image_transform.py create mode 100644 Tests/test_image_transpose.py create mode 100644 Tests/test_image_verify.py create mode 100644 Tests/test_imagechops.py create mode 100644 Tests/test_imagecms.py create mode 100644 Tests/test_imagecolor.py create mode 100644 Tests/test_imagedraw.py create mode 100644 Tests/test_imageenhance.py create mode 100644 Tests/test_imagefile.py create mode 100644 Tests/test_imagefileio.py create mode 100644 Tests/test_imagefilter.py create mode 100644 Tests/test_imagefont.py create mode 100644 Tests/test_imagegl.py create mode 100644 Tests/test_imagegrab.py create mode 100644 Tests/test_imagemath.py create mode 100644 Tests/test_imagemode.py create mode 100644 Tests/test_imageops.py create mode 100644 Tests/test_imageops_usm.py create mode 100644 Tests/test_imagepalette.py create mode 100644 Tests/test_imagepath.py create mode 100644 Tests/test_imageqt.py create mode 100644 Tests/test_imagesequence.py create mode 100644 Tests/test_imageshow.py create mode 100644 Tests/test_imagestat.py create mode 100644 Tests/test_imagetk.py create mode 100644 Tests/test_imagetransform.py create mode 100644 Tests/test_imagewin.py create mode 100644 Tests/test_lib_image.py create mode 100644 Tests/test_lib_pack.py create mode 100644 Tests/test_mode_i16.py create mode 100644 Tests/test_numpy.py create mode 100644 Tests/tester.py create mode 100644 Tests/threaded_save.py create mode 100644 Tests/versions.py diff --git a/Tests/README.txt b/Tests/README.txt new file mode 100644 index 000000000..7622836b8 --- /dev/null +++ b/Tests/README.txt @@ -0,0 +1,4 @@ +Minimalistic PIL test framework. + +Test scripts are named "test_xxx" and are supposed to output "ok". +That's it. diff --git a/Tests/bench_get.py b/Tests/bench_get.py new file mode 100644 index 000000000..eca491600 --- /dev/null +++ b/Tests/bench_get.py @@ -0,0 +1,20 @@ +import sys +sys.path.insert(0, ".") + +import tester +import timeit + +def bench(mode): + im = tester.lena(mode) + get = im.im.getpixel + xy = 50, 50 # position shouldn't really matter + t0 = timeit.default_timer() + for i in range(1000000): + get(xy) + print(mode, timeit.default_timer() - t0, "us") + +bench("L") +bench("I") +bench("I;16") +bench("F") +bench("RGB") diff --git a/Tests/cms_test.py b/Tests/cms_test.py new file mode 100644 index 000000000..ba1c96527 --- /dev/null +++ b/Tests/cms_test.py @@ -0,0 +1,222 @@ +# PyCMSTests.py +# Examples of how to use pyCMS, as well as tests to verify it works properly +# By Kevin Cazabon (kevin@cazabon.com) + +# Imports +import os +from PIL import Image +from PIL import ImageCms + +# import PyCMSError separately so we can catch it +PyCMSError = ImageCms.PyCMSError + +####################################################################### +# Configuration: +####################################################################### +# set this to the image you want to test with +IMAGE = "c:\\temp\\test.tif" + +# set this to where you want to save the output images +OUTPUTDIR = "c:\\temp\\" + +# set these to two different ICC profiles, one for input, one for output +# set the corresponding mode to the proper PIL mode for that profile +INPUT_PROFILE = "c:\\temp\\profiles\\sRGB.icm" +INMODE = "RGB" + +OUTPUT_PROFILE = "c:\\temp\\profiles\\genericRGB.icm" +OUTMODE = "RGB" + +PROOF_PROFILE = "c:\\temp\\profiles\\monitor.icm" + +# set to True to show() images, False to save them into OUTPUT_DIRECTORY +SHOW = False + +# Tests you can enable/disable +TEST_error_catching = True +TEST_profileToProfile = True +TEST_profileToProfile_inPlace = True +TEST_buildTransform = True +TEST_buildTransformFromOpenProfiles = True +TEST_buildProofTransform = True +TEST_getProfileInfo = True +TEST_misc = False + +####################################################################### +# helper functions +####################################################################### +def outputImage(im, funcName = None): + # save or display the image, depending on value of SHOW_IMAGES + if SHOW == True: + im.show() + else: + im.save(os.path.join(OUTPUTDIR, "%s.tif" %funcName)) + + +####################################################################### +# The tests themselves +####################################################################### + +if TEST_error_catching == True: + im = Image.open(IMAGE) + try: + #neither of these proifles exists (unless you make them), so we should + # get an error + imOut = ImageCms.profileToProfile(im, "missingProfile.icm", "cmyk.icm") + + except PyCMSError as reason: + print("We caught a PyCMSError: %s\n\n" %reason) + + print("error catching test completed successfully (if you see the message \ + above that we caught the error).") + +if TEST_profileToProfile == True: + # open the image file using the standard PIL function Image.open() + im = Image.open(IMAGE) + + # send the image, input/output profiles, and rendering intent to + # ImageCms.profileToProfile() + imOut = ImageCms.profileToProfile(im, INPUT_PROFILE, OUTPUT_PROFILE, \ + outputMode = OUTMODE) + + # now that the image is converted, save or display it + outputImage(imOut, "profileToProfile") + + print("profileToProfile test completed successfully.") + +if TEST_profileToProfile_inPlace == True: + # we'll do the same test as profileToProfile, but modify im in place + # instead of getting a new image returned to us + im = Image.open(IMAGE) + + # send the image to ImageCms.profileToProfile(), specifying inPlace = True + result = ImageCms.profileToProfile(im, INPUT_PROFILE, OUTPUT_PROFILE, \ + outputMode = OUTMODE, inPlace = True) + + # now that the image is converted, save or display it + if result == None: + # this is the normal result when modifying in-place + outputImage(im, "profileToProfile_inPlace") + else: + # something failed... + print("profileToProfile in-place failed: %s" %result) + + print("profileToProfile in-place test completed successfully.") + +if TEST_buildTransform == True: + # make a transform using the input and output profile path strings + transform = ImageCms.buildTransform(INPUT_PROFILE, OUTPUT_PROFILE, INMODE, \ + OUTMODE) + + # now, use the trnsform to convert a couple images + im = Image.open(IMAGE) + + # transform im normally + im2 = ImageCms.applyTransform(im, transform) + outputImage(im2, "buildTransform") + + # then transform it again using the same transform, this time in-place. + result = ImageCms.applyTransform(im, transform, inPlace = True) + outputImage(im, "buildTransform_inPlace") + + print("buildTransform test completed successfully.") + + # and, to clean up a bit, delete the transform + # this should call the C destructor for the transform structure. + # Python should also do this automatically when it goes out of scope. + del(transform) + +if TEST_buildTransformFromOpenProfiles == True: + # we'll actually test a couple profile open/creation functions here too + + # first, get a handle to an input profile, in this case we'll create + # an sRGB profile on the fly: + inputProfile = ImageCms.createProfile("sRGB") + + # then, get a handle to the output profile + outputProfile = ImageCms.getOpenProfile(OUTPUT_PROFILE) + + # make a transform from these + transform = ImageCms.buildTransformFromOpenProfiles(inputProfile, \ + outputProfile, INMODE, OUTMODE) + + # now, use the trnsform to convert a couple images + im = Image.open(IMAGE) + + # transform im normally + im2 = ImageCms.applyTransform(im, transform) + outputImage(im2, "buildTransformFromOpenProfiles") + + # then do it again using the same transform, this time in-place. + result = ImageCms.applyTransform(im, transform, inPlace = True) + outputImage(im, "buildTransformFromOpenProfiles_inPlace") + + print("buildTransformFromOpenProfiles test completed successfully.") + + # and, to clean up a bit, delete the transform + # this should call the C destructor for the each item. + # Python should also do this automatically when it goes out of scope. + del(inputProfile) + del(outputProfile) + del(transform) + +if TEST_buildProofTransform == True: + # make a transform using the input and output and proof profile path + # strings + # images converted with this transform will simulate the appearance + # of the output device while actually being displayed/proofed on the + # proof device. This usually means a monitor, but can also mean + # other proof-printers like dye-sub, etc. + transform = ImageCms.buildProofTransform(INPUT_PROFILE, OUTPUT_PROFILE, \ + PROOF_PROFILE, INMODE, OUTMODE) + + # now, use the trnsform to convert a couple images + im = Image.open(IMAGE) + + # transform im normally + im2 = ImageCms.applyTransform(im, transform) + outputImage(im2, "buildProofTransform") + + # then transform it again using the same transform, this time in-place. + result = ImageCms.applyTransform(im, transform, inPlace = True) + outputImage(im, "buildProofTransform_inPlace") + + print("buildProofTransform test completed successfully.") + + # and, to clean up a bit, delete the transform + # this should call the C destructor for the transform structure. + # Python should also do this automatically when it goes out of scope. + del(transform) + +if TEST_getProfileInfo == True: + # get a profile handle + profile = ImageCms.getOpenProfile(INPUT_PROFILE) + + # lets print some info about our input profile: + print("Profile name (retrieved from profile string path name): %s" %ImageCms.getProfileName(INPUT_PROFILE)) + + # or, you could do the same thing using a profile handle as the arg + print("Profile name (retrieved from profile handle): %s" %ImageCms.getProfileName(profile)) + + # now lets get the embedded "info" tag contents + # once again, you can use a path to a profile, or a profile handle + print("Profile info (retrieved from profile handle): %s" %ImageCms.getProfileInfo(profile)) + + # and what's the default intent of this profile? + print("The default intent is (this will be an integer): %d" %(ImageCms.getDefaultIntent(profile))) + + # Hmmmm... but does this profile support INTENT_ABSOLUTE_COLORIMETRIC? + print("Does it support INTENT_ABSOLUTE_COLORIMETRIC?: (1 is yes, -1 is no): %s" \ + %ImageCms.isIntentSupported(profile, ImageCms.INTENT_ABSOLUTE_COLORIMETRIC, \ + ImageCms.DIRECTION_INPUT)) + + print("getProfileInfo test completed successfully.") + +if TEST_misc == True: + # test the versions, about, and copyright functions + print("Versions: %s" %str(ImageCms.versions())) + print("About:\n\n%s" %ImageCms.about()) + print("Copyright:\n\n%s" %ImageCms.copyright()) + + print("misc test completed successfully.") + diff --git a/Tests/crash_ttf_memory_error.py b/Tests/crash_ttf_memory_error.py new file mode 100644 index 000000000..881fc03a6 --- /dev/null +++ b/Tests/crash_ttf_memory_error.py @@ -0,0 +1,14 @@ +from PIL import Image, ImageFont, ImageDraw + +font = "../pil-archive/memory-error-2.ttf" + +s = "Test Text" +f = ImageFont.truetype(font, 64, index=0, encoding="unicode") +w, h = f.getsize(s) +i = Image.new("RGB", (500, h), "white") +d = ImageDraw.Draw(i) + +# this line causes a MemoryError +d.text((0,0), s, font=f, fill=0) + +i.show() diff --git a/Tests/fonts/helvO18.pcf b/Tests/fonts/helvO18.pcf new file mode 100644 index 0000000000000000000000000000000000000000..f5e68ae9c5a749d4c35c48f5a1038aa919162634 GIT binary patch literal 78412 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 tvJO2|hF& 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 literal 0 HcmV?d00001 diff --git a/Tests/icc/YCC709.icm b/Tests/icc/YCC709.icm new file mode 100644 index 0000000000000000000000000000000000000000..d9f5a5a5df83ba666057c836aaad7221972e8225 GIT binary patch literal 101940 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

Q~&++qG<@nP9v3{YJ?sW%q;NPM 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 L{PK7vZD!`*_k{EN literal 0 HcmV?d00001 diff --git a/Tests/images/broken.png b/Tests/images/broken.png new file mode 100644 index 000000000..7def38564 --- /dev/null +++ b/Tests/images/broken.png @@ -0,0 +1,5 @@ +‰PNG + +/Å}Pô¨áÌ’ï>ƒ’0jÈ‚&ë✉\Þ@äÖô­ T´LU +¥í÷âxÃÅ/Ð +Z`ײwëÙ;†9 âcˆ€ \ No newline at end of file diff --git a/Tests/images/caption_6_33_22.png b/Tests/images/caption_6_33_22.png new file mode 100644 index 0000000000000000000000000000000000000000..2aa0a50bf26ae78aafa6e85816c31c91e6040d96 GIT binary patch literal 15378 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 C3g^H8 literal 0 HcmV?d00001 diff --git a/Tests/images/pil123p.png b/Tests/images/pil123p.png new file mode 100644 index 0000000000000000000000000000000000000000..03960d4939938541ca3f8efee4bf13ffdecbb2f5 GIT binary patch literal 12901 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

BdL{r~fT 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 literal 0 HcmV?d00001 diff --git a/Tests/images/pil136.tiff b/Tests/images/pil136.tiff new file mode 100644 index 0000000000000000000000000000000000000000..07d339e7c51774b7754365832003f868a494847d GIT binary patch literal 9654 zcmeI2ZA?>F7{{NY6ooRWQlv+rDVDjH7FemM;v{h$e-sYd4*Qd|# zJm;KyPkJLF$dgFc{iy-SsZYa+=42#pia>FuA4KoP;L6=5^c_t=)!q=q?@K{lNi>SeB9Ngj z#g+4E2+K%7ZBsTHb3##8pMp#GK0{Hs3KP+d$%YI@`XQcmYfC6fVKo=JFd+& z`B}LAQv<3l*W%{&BJ}^lVQBCm2ERLw-yRe}92tk+zBCjx9>AkN8qhOz1h;=^#P5&l zP8n`m3Wedmj_GT_8sUkX zkQ0&&&ys-6Sw7p*<$Ex6rx>MITkzwZDs-LMhg)|maQfRL7(ADap@+?g&yPoLWg>Eu z7xLQRvuk1*51WXyqIr0> z7P;$>zlki`KJl>Ga?{8i<4H))+P2Is&%-9-tVsn!G;*IXc;EW3*?HLPI2-bYA(~De zdi_-e2E)sDIo^$mMu^W+1o$q(rd`PhS>lV8tJYw}+V@#nj_9-uEcPF1w<>5Qf`Wq) zpqdXK|45{!#$rjpa`-ZZ$8JSrL>NLt{Gsyk$A+{##0M`$R8kUrVzRI+Aw=639X0{Y z7=-Y1?FZF$y{^qN%eD?E}})(bj|h_AHc~?ZfB2U*Y_hmr>u^gx%@;ajy3y z&i3~Vw>#a^hBMt=IG9m{uHI8ncXr@(PcQoV)W~h@z^Sft=xeV<|NXn@XgH3pzOQku z`w+HPoIpu}kG3B=Y*T0!_XaJ8p|T=3ZJWb+dl}n5Jd_ZLrI0y0!=CLW5~&n&r4kCc z3?i8VGCL_$9&*SO^5J%xI%la2_NA$@+_-qyzEmcLSnkUD zDR%yZMA%Q zQEhnG962$C!59h2Mav%v(rTJ<^1>IWX|6_KN;O)Vo6&MOSF7EaaemQtI&4C6;$~4K zjFD#kzNE2#9=kkjbJ`>n4P!Km);*68FRL#Pn+rFaHp5tHotCHn#?(F?EcFs7?-IU z`R|9FO=}yFahOA8dK@yU>v6oT0w3mA;aFEUnp+#NGj<)q1O1SkSBP!fV~}21h4j*D z98_WH-tWm6^If>D=FJ$cwR+Gd9yiWb?!qky!jB{R-l#!)8G?q1NPH zYpNK7#-=%F8S~@yHIYZaRzReA+eAPtmIA?OdI3vY45!%}HLfj!DWm1Au|PPQwqR*7 zY2LVDr8G?-87*feg4zF+EB_QYk>yAm*G|ElC+Tj1^HVn6pR&3B-*VPZ^FGhW$NF(G K(R@1^{r(%}tu+n+ literal 0 HcmV?d00001 diff --git a/Tests/images/pil168.tif b/Tests/images/pil168.tif new file mode 100644 index 0000000000000000000000000000000000000000..621f03a2fc9e621a28130d630aa6a68ade641cd4 GIT binary patch literal 5757 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 literal 0 HcmV?d00001 diff --git a/Tests/images/pil_sample_rgb.jpg b/Tests/images/pil_sample_rgb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..956a86bae7286bda2069fb017746daac588965ad GIT binary patch literal 29342 zcmeIb2Urx#(l9)`OU@YqL2?w9AW?$koHG&xcFF7#mLMo71{9SX1jK-35EV&+h!P|T zO3q3~kR*yIhjQ!S01yF$5E=jmLJ;r|fG`92I2Zt&AS~Zu4+#G^8YoC3 z27qUP75w=@#Bnek2**Ua19;zfv%u?1@CVk2Ep_Lrj6gdf*^S)L7_`3|+J{}$lwIG^ z*&T&V0^*{gvT~vla-ve~;^J~*l5*m*ARp`|ExiQ4?wn;018|RK%4?gfNT!~ zX8|%IA|hfUGGbyfYElwXYI;gCGD`Y=w6yfJwEL*ZaL2dHPU5#`2stS!IR!Zt1qBry z1qB5i_C!Iq!$SR63fO)EP!jU0EO*lQUMS=2n>n`#U~^n!iSMbfSJ@VJPsN$d}U)tT29~7;skVY zx9+QOanqYTb&@#b7tyIo$P;h6GXBolUy>oSvCDh{x%%L2eRsg* zdkwzCtaGJF4LwsIvdbEKr`If80?#Mslt1g6`6#Vv=^7N7l3UT#Kf6v1K%tE{QW)gKcM<+r0=^$2Y!3lsFkGF~fD$md4a`arZX6Dq*#_p+YJb4$?c6svi$$6i zG21}*iP_-rsKI$_^XZwvI4h2rVMwQ(9-toa1mX0BbH-kJ-E zir410$mfpN*3ssUHvtogS@GIDO4~12v*I=Hl59#XNXCB}dTntpV9X0X`Ve|#r0Y$c ziR8Z2aEvdz_R)%Lmu|KP*7nP{AGZ#RjX#`I$_^l~oKMqD?U-SxHQX4!7P((3*mL61 z>R{umgJ&YGLwM%CzBlGxboW1_rY*{SO7g2|O+mYzgvhLSo_LemqIX$k(?>70X7Xk> zPsdB#AI|b9EuDe46vWqVk``n@oHPyeohsilJuzYC5c~goz#Qs=Cr|_|gEvE9CS4x^a zBPpPWCkr;qLux%R`VM#%3%%Mbe3U|TjcaMM5y47?lpZAPXYzWZjT5ympT2y4LiH?Y zFm=l9&eiOfPUf2P(QH>xl6?k~M{Oq`zM5Ii>95%cLneuw#OzD(2nW5v8lgRyTx#4T(%UEX09fB)zqf`~xIIF38TCzC@gP9FFm zSQFy{3%_c)R#_ubQ6ct@>@#7O+C*IHhpz=PwboxLmt_?kmut_a|@A?PENEIZTjGW5;}OIyiO zt`A4?y~Q{sy^m|JmbQU)=F%^js{55+M_N$mSmkyglf{f=QFKZv&&LBU*>~Itee3Id z+AaC2oaAGogUuCOyfLLR!)5L0T9czn>fIlbBTeTOqfeG?rLeVUg}%0*WhLwioX&W= z@i}R5t|Z@IqxD(eoA3br=ucd}1<~g^W-2wjuF2|ME@^IK)!~{A5xHT0@OeeIB$WJ& zGpY2c1Fygj^Y}%gSMR2<79h@`{D=e>fO#?g1sVKO=EJ% zo!bWb8O2hf7i`n{eG{xtozN6knkkOS9<17`URR~8IMH+<^W7JoN-hjU!wU%;j`6ijw8LjPlsqpL-KuZAyKXxbuWjS&u-yf^R;RPO z3)@?K=dPmEuuhuErXexV87zyBGd&zEa`W^P_OxLK)&XFpSAv`D6y!mxKXtu;&XIIz zVaKa8c>(+VPtuFeR28ZYIv4uzoL%@(lzafyBrq{;@zh1ibEq@V=lTST=)AsG^ zYLPI!swtVt-Tz{Ql5B}tt()sMFp?hrB4|C=kS+({%VuCZdaW_SFVV@ZEt<3Z>)q!A z^F^|(I_r~X{E5BfYJGa|EDfp@(sEwAhPJ7&oVOaiRYwtxp4sA|9AX09koWcb(XDyP zmgf75CzETIT|51+X|rx+_rzB>%Hh$6tAmo}sX>MQ zR-=7HCr=T--i&Su|2ow7U=$g665;vQCzN!U!X58`bLhE@O;x3@Q^Q|FYir^Sg(9tAHZF7( zesX!kg2pf<<)fJcGWl>oG(70iMZR~&hD|YN;{)PG${rT`%uqK`IbUMCf05JV!G=kq zGd_2`j>hfnZm?t4<`MX9kG+d9-R}8k1ik-^U~qepkL1TBN^k| zR5i0UQfK$^a`(ru8=0%$5d`yl-=$MwL%gh2)o1O~wgRXK7QalQN+m66{&&t^L7M5eJ!+~dk7kZar81l`pd(y^dQ?e_TT5nxI23y zF(S@>NJk9XZfnwiVh7*4u zu)*5CkK%i<-=s8iN4q-Wto@&B=|9k6kDcB9(ZY`Z$F}}$tNt|2Q$~0M_+yX=EYbw& zjQLM=`Tv=M*jCzeBY`R0KrSi*I`oer{hy$vWh8!&T2fN>C-j~h;a`8R{YCSD{oa4M z1N>IQKkxuyF`1tl@0(-%0a`{JyuJU?UnHfae?tG8c>rh%ZE!pUA7B5YyWoFx?LSlO z-@ae|A-p-t@xQWT{!1GE!F~Dvho1TO?E_-}d%EVors5y?z#nwNe}Mka?wfsl5dXdX z^B*aen$E2;PUNhNZCjmd;-S4y8ba&{`OQQDk>rl&L02Tt6I!)pFIzl-*|po zCvJ4cj?_DkvU|$@{+RV=Po)1S>+S>KZ$jbbl+|ocWE>r>+5&}k9P(tC`OWR8@8K^SM6+aX$teV9E^il8haS=evp21RL3@8oV?_Z>T-|o_v1tN-FL!68 zzlE2cKbV62R1ZEb4@A>|KSEqWTWwF-gsy(*0H2>w1mH52t2+vb3h)Mb$ka`-rGtwL zAP!8EI|g9Tnn)DV4_vLmNn-|fPv3}1c8IYUkQC7Nc4Y@I|J(Y*0{pzp)UC|Gs=gT) zYy6)v`u?uSpD+ZDUKle+*Pn0{&Pb3C8H~~P*D}-Bb3&uNumuwBqJJVLc0>DxD0{iP z?plg+M|p6SZwC!>5+aZ;jsad65F`!+-?je^IrbeX4*fGZsgtWJ+6(Qs$GFrx<*R6Z z&j48f12hV2Yhn!A$1ninkKA<(Y#xah=t%#7C38Y!K!^GVJSo`3ZoehR-H-g(!T>Vx z2T@wV!8>;wHi&M=h4FE8SPFnB7d&CjhIJ0`2RR4;0iq!O60i>pGW!*l_A4xH=Hsuh zv|nLqzrxafg{A!pOZyd;_J0+Ywljy}0B0!xU<&>q*hvc|pbSo0(0~*8V89L-0d63S z0e}8D$OojL`6m?Yfa*?hJLT^@hY*6FEr3s-5b$#b#xLIj&rtp%j@S9y!kj{gTC0Ekl>74fp59GmXF;Xp}=P;sV}PUql$EM*9!4NnuZvdIfr;U%Od!& z5pcnB!QMXJNQ@&p7%_+PmkU4w0di7&V1a%J7daC(jc>()DFwbg0dqkTB4|HXxR|W0EL>C^E-o$% zQV9DW2ZO4Dg;D-oU~M=t+^xQ|{iLqD6;4~QA`*67Rcc6oXFqozY(y42wrWT4nF*u7 z7ZBi%kdqaaKsX{~5W=F);z(gJF$7ZB(NRKN*hNB0_K*`2A%#GS@{zEAs}c!*Eb{x6 zVsmz@WoMViCgpH*X;aYRNJTIj;kPKT&>b=(_h6)#m72RZ5`}%AqbMc{zP-Uw|2F4m z7VAG`*^>jB0FKppj}878?BcVh34dw}FaxxT1RQLPe~lo!-_!hlEBWkZ?`f*eY{)NriBQ!QCwtO$Y!@3I&X$8h$p}hjIHvkwj z3E!pNi~de){rj|g(cfu*keZ|1F^XU`Ca${Qp#L?d13S6jZ}Z*W59@;L@?c6%6Su5!4|9Lxjd*gZoTvO=l%c-HA1HhgSqpha6 zGpHcY&S1a%;|~1RLp%Rj4~m9-5!VFwsGL<~kTfk8r!&i+37rW)Az7C>8FmE9jC!ooj}k9|9lFWtggM(pfA z@P7%ScJ}cDBUB(pAhiSnd=C%8XF=F22;+mruYfR}lP4C2;$dMwP(TpghlO2tU@*o5 zq}hRwU}1ze3XJ`LVrBM0cq6cI0|;LT48R5r!Sq1*e4slr2!wk;nA{`emFC+#dYy>W^IQk*jRngu)j;P~ckP1#`EEhn7wJkenWGOLODJfxb5p0as z?(wIYyF~xwif!8+lJ~~AHiIxc|AG6#`~!#11Y_O6ct2R|51dmf092dW^CZf5^5+ z1}wPa*C0Tf^%bCV5CN!O&;hW;=KvlpDFCy*4(33=OhWzLaUpeps)-r9bAVsq4hbIif)9{@%a?Qj6Tk*=0sMe4APz_ahk+x2I-mm> z0%m|UU=KKh3z^=49}onb08RtvflELvkOZUwH-Ic4A1DS&fC}Id@Dz9kw1FF<^#a4d z7%&aI1y+EMz$Uo$79oTjLJMJn9DwjZgdpM&8Hgf89ij&@fmlP1L0lmyNC4ynDLv==%CeG6R!_evv$F~B%r!Y~<_D$EdO19O4-!NOosuw+;! ztQb}WYl3yd#$XGu&v*oQw0P`z!gz=AwD8RFobi0|!tgHRrQzk_mE$$wb>ofWt>Asd zC&%B9FN80LuZ?eo?}{IUe;z*>KL@`IzY)I|e;WTI0RaI60Uv=hffj)^fd@e-!DWIB zg1ZDy2s#NS3DyV+37H6m2o(qo2^|SBgy#uU35y783A+fV2|p2$5*;8CC(oNkUD+N1{MtM&dzon&c`; zF-arI2+4a=Qc_M*SyE$CchXa&S4r=YHj|E%ekP+K6C_h5vn2~4izdq@dqOry_MV)a zoR|CvxeYmnJeoY8yq^3O`6mim3K0rz3Is(sMLI<}MHj^qB{3xrr81>GWe8<5HGRE|_(ROwU?srsqbsA;Lis12#TsV`F(P`6OOp&_KiymcuO0EKw{aEJORD`vv!#><`_4d;jzOYpiUnnyfyosjT&^ z3v3K*N7y{r64@TJ%^jdUpm@OjK;nVg1M}?k?8@w3>{rjuF^>$78&3*P6VEy?AFm~EByR=p z8@_#f+I%5=g?uCY0 z@ej%#L>OsS)#*YG-5hp z5n@$htKx#<&f@9fJrd*+8WQ0Wl@jj`2^~Tnx_)Rtl2%e*GE%Zma!X2D%1^3TYEGJ4 z`k3@J>3$hH86%m?GR?C1vMRFSvX5jx%Sp*$NSyz=)J*oOc z4W_247NypqPNQzFo~HgvgHyv*qflc-Q&KZj^NAL|mabNuR=+l@wzGD=_KJ?Q&PkmH zT{2x$-89_^JwZJ`y()dEzK(u^{)hpO0m`7l5HQp>OfVcZ;xqC!sx~GtHZo2(o-q+K zIbqUdN^9z1T44IoOvNn5Y}lONJixrpg3`j)BHv=&Qq3~na?A>Db<(QMn%Uajy3&Tw z#=<7YX6>l@(WIl(wvx8zZTsx_?1JrD?3wMo>}wn-9UL7V9K%0md92{r7e_=_BNG-e=5L&Ns<-#ZT8S#~Ur}9pdoc2839w8bLAMxRg<(aCptY=T1ojj*`uJAm?dB5}h zk%uF1T)?~Fexc){#KqK$U!xFFt(QbEC13h-+4*wo6|pN|dU;3fPGzxh@vXZIcQ4%o?giYNzklq0 zUx{u>-2<5i#icx@*UD(iqRJuV$IDkL+$zQ@tt&ep>O8EgI$Tv&EmEEPh~rUu4Sh|_ zW0J>bA8*%&)UG}8d9v`-_331tL)~z_Reeu`aYIL=Ze#N^jc4^u%1yP+3eAsN(TCM>ow@@>@)8h z=(p`38$b-a8T1-_HxxLuIecmaeU227Mv?a&=2!tLm%n*O6^+ z@T-g;n|U4q=K?#MdG2hL`IpYn9|!oo%(r6?CwA*f=q~;*U$=j3<_Ye8`C~Ir^6dt2 zim|g{CwA)c?SSAm^2CQhc5?Pif*`m(KB0IpD)4gxD1Z-z;t^3`KkEVa|HSU62@q1# z(9#jnGpulkDKioqJKh)P>a|SqjeFY3DZwpyE}K_sA5&n3EHwZDg$EVEBO%9qor7fu z@Cm4C2svoQ=!iJ!8I+C1xqQ306MK>@821r7p1!Xlk#LB|yqDLK$;q$8)E`sYP!=ey zDf{zwnzM{w+dgOl;0}z7#Y$Ei^oLhBSNx5YM6F{!BvpKB+6D-VH^QUPxv!hQv@PqR z*UFR@YSp&bx`!PiH_vC(&wmcDRh^Rg@^nV2%i_i4fiG+~Cer8DR}YJCb`5WN+Z3&8 zx+tSqyZr}xbK(~q4~C5{q;=eEFDfkK6rCGqpC@a`HuKoOLsptTQcB_c z?9`@yo2pyv4LJHD^~r{k_ls9-9g&CaEb;{SJT7Y89}Kd9-78buq3(khZ-g4aHKj;iH+o91~(+bw>!sRoHb?>x!Gbm zPHCnfqn^oadU~1sIXzPwkV+uRa=Qy#Q18I$u9Qn+jy2SMRlzeSxaxRChtmy8uVEhL zagyz0hAb|Y4!fK8*yexqsNl*JRFL2`eJ66%U%XlmUxy~`TB1aC$XTWWFFenOb`4F! ziR8qulIW-xp_(>reH0WOC4og9)-ID2HS&@JNNW+Po}~Q6n)1t<#qBNLYxH;@_q$W_ zxR&R1-7_^mncL_+sIdTDBs9t0$n~GQJ~wQ0{;{}13i?$bhj6I-=*Ns9JNp~bhIt04 z{ZF5zqNZ#OmS0Jw`XLEEj1ERhwpW*R2R6?S7f0%2`c-q!*$<+#!UCV@;mrmL3CEd4 zY(m3Sqt)PnAJ-4tJ1xBSuc%@9==mT-+P%{Aefm4g@TZn_J+rp8@pn_{_n*zMa4HK> zv&lTh*>NgyF2A?hOij%o7tTRqdR2`?^+H&jEGb2*tVNIg%aN6v88I9K^CNfhPHnLC zYEHrOdoc5opWv?&w~jb}YO_v^mJM?eEFbaFsn9wXfRO6!?5C?nq&kw{E}ms9132mo zt`z0e-$Rrp%ow+KbV^f>mLno!Uf+v4rk-(7jpp#6w&uY}E*rX8h;jY7cx4)2xkv#( zk1@0(`@G#rM|C1?V`81;J3!B(3N-Qddmi?D&6{``LeSxH1-~04qfA~oYLT%+y2YjS z%DP56x-pN-2a)%*UcK$$$muQ^u`wb!w{j==MTH2u=VES2=Fl{a$L(Hc&!Y+Y2F<)J z^v3Fz9uk*o<$N^q4~~m7DZ@GRZXMCQc;?D&CB|7du}1s(`ljM_pP_39Ra$)W4FkK5m~86Vjo3FNaSI#`jJQcW zFIWLT6K1l%l`gFzQk)O3R{$+HRu>l$6L2E?R(V)OQEt7Z_ehL8_>P(Xe^E_hE?gXwQ z(#<1wsl%VPf!KrkL#wI$Nbm9wm3GA==km+1*_LXVX`~71M2rM{;JBG2(90pfZ9#vR z>Em?Ak#~nanjN*x)Hgd(?qq~lI*MmRUecj?LY0<-=+P$3TXdRL)R8?_9y5% zVw#ZyPKTXz;_2>GD;wcmQ9o%LTw6J0t#EZoByniGNBw|@%m{M;3*5Ti>~)3i%f!dY zMrL+VSyt!fe8n|jkss6uIf{=wV>`2~;gDSIa(3O6#MkqPj`kAK<{>;PgBl|CwY&Z& zh29H4;I?4#s~F (Pxcn9;r>Eh_A$dqF#@urgS{J6}jA&?8GgkU4_fXp`2+tKHxo z!%>P<39G{i{OOt^UD^$%y)@MGIdvWimOjf#dZZ1F>i$==sYD}Tz!j&Kc&idAv#t0y zJ!b)8VmSf1PbigBHUZm!0M|4dd!OPIihb%8*F$N~sS|<$IXXS1<+*W%B8jYw1F?g) zK~Iz(BYUrqm>2hQr=ydqn&=u2(QkKSdrXTlNqw6OD#360qe5Kn@NS$bn7YQJ#8u$Q z;CX0BDio%kb<29-L&j<&@?Oa>V8M^vCeJa*yZ@(wWH>p<0k2w_XUchy2|v^Sc@bklhl zL#qWt#Q7%HQ%#Y1qFoG?3EuG}^+aapWNeP#IIyhwWsCKbtdu3?3%a8QixRW6=&$ce}PcS2c~Ayf!`}*qAh#JYpZ3+@$b)Yo1P4MCV5IAopPr z)@%#QS?!};bXm76La$Kkz&WVm%Y&-Vf3$q`h-m7np1*KwVEL)t^#w?f=i&(>Vq`a{*9 zscA17BC{%6d%7qs4PG z7rVm|k{6>28nlbIBwvWOs0!v?Ek1|xwKH%O-S0OM(vB*zhF=+&;AFN%_P%LeJT>ce zWsa!ZqlzNGTmQBpNkiOcO8Auhk;#^knDB(KFzx{_d_&80o7=?N*3lC;mKf7`P&AQ2 z5w`w;w_NR>fnIEr_hfN%PH3r&OEOJsp|ZzQ()y15(IR#N0Q3Gk`&sHkR9d8&Pms&{GG2CSVcmsGtykkQ^>JK7fHGTN)U zlbeZc=oFnOV^k=Olz~3~x6}nFy8ymCDV`LE*9j(%TM*7%l)XtH=@&tE|TKwMom&D>qM36M#Zk2 zgaer>CUqn+&YRl^sVv+t8l!fPHl@2!fG4#7#p47X4BGR|IQH9AnGuP>Xdxb12 z5!<>_M5f+R>y)%|hm!2AC!6%bA(VX1sRANu5 z<1S(%CJdbYNUq7mP{@{lTAaRozR9ab)1Yta5PeS7qGd$)-L^7E?f&VmO0m{2p?(w5 zTF*bt&oBESb3!i%NhL-eCG>~mW$2i^7xeDAVsQGH#|e*DNSFKThRoYN*lBFv_?qo( zj^?M<7b9#5^K#pOZT3KD)9|bOXIm)E+jB~*5{4Vg(v}IiZx|lSf5~|GaMP8!H&OLH zr7Oj8k)@UrilwF?*O54b>aD@U730M0ny%;9arU%;V(I>x+-KgsZLEZ z;(h&ja!%<{dY%J7sdo3&tx+aX*$bv5oJMT^R5`bO&V6OQida-^h|H4V$`>vf%J9j? ze_4jdWlj}eitk2|etM1p-y#3x#K&9c%EOO(1?|W1CN+ zN?y6j_1K0&SfQ>fHr~Q0$-zygV49V0bH)Kt5!-*Kpi{gs+dA>FmMZ54Z@xozRUFj3 zoU|3cPTusq5eZ>Y!Adb5NA*pDmPBEpv-#^SMDT{$A!zR-RODsIsT7qpRnJ z-2CFl-T_Q^yShk+U}uFrAI0TFnyxDbEE;-sg*oKwjZwaIs*gqA*~C#95W?r`FXH!= z&qzHRdbW_lLG9>y2``9*fhKIq%Z?v> zygriZ#GhQ3p}hW~3}t4V(s~m1mUyJdfT&a1-dUYz&Pr_RMO;|>t8|hFA89AA-0ec# z?p()zVYRV%-LMd!;cX#Y`0bU@-uSm4no+62+$t&a6S6^gPfyNX7?}Oy92PU`X+KP} z>CH7{)Je3MaXY8VBjl|O?flW6<)I0! z^OTFZQ}2>jpk3`N@$3a;_ekt)KzAkoo9s6kNBY%1yaDKMSDYArAKBV>xp16?C#F`4 z=0rv&JU-&Jx4!hlysaiFf%fXr!yW5%*_eKvQG(cvr65#m0kb$?P0_iLJTZ4WJ z0riE8N}oAUA3E$SD01&P${q**uYqCy)4u%am5)w=0%5wSH!G3;_bVJ8ns(PLl~)7@ zhqf$J-o$i1o>{@)25LLL#5sRTc{ub45!o90;vu*Nd~8r?^`v#pjqKuW;LPF%YV@_i z*M%bK%5C67?~Si^>f1n{mdcBuOIx*VU@(QUbe z(yaxu~xi?pfK?>JJh~>auw96;*v0CZ7wByj56YNwIv7hNH|P)mu$y z%Vm!%tH@(c(FrF+5ev-S?xd)#eZ%nD=~El~m9s+%he>m6M{}50-b!?=i{w`vDmM?R zkvA*vO`911kX=D+ZT@&8Hp$I7i~oV(1lSxLWvdl6x|Zh#eQ4?4b|0>>85Y*8ydO57 zB)-_o5klXyTxc@)=;CpR-02>DV>?)2=9CU64;$TnO41r>w-#63d-9_lf&&4`Q{q{~ zM8qewVs7Vkx(7Tcy+TB~m@p>9zmdB}*(4$Hm96RiSJMjJ`n%LiM!BtJBg`iQ^GQR7 zrVHMVoZSX|BagMAA0_cT8?p5jF7I6wtl4sX@HRGYRMKMgfdyx*oQZGA;xgj}m$`M4 zL?=GSWCifwpm^UeL1gk-7ntAHEA={TDlX7JJuxlH9H<`s;`p$I`UU0K`7WdKUN*Uo z{IArxhpu=;(hDiSd9(ERUI~?9Z`z~aODVp=$zNtKY#l))R~l#NUF~MBvb%lTxoY17 zrxcOTjT;|794GEHN}0OT*(P9{cq*U2-^?)J0}s3rEK)kI9%XN{~}OgVb4=FNi!zR)`|L&GK( z=X`r0x!dR^luY3`c*PM_qN76RF_VncU)hI^|SuRfPhGb zm&YM?6|rVgRp&4RCI(#rsOAE5slH}|@%x3n1Et>8jwN~v)q;{|LxTzyT6ns&l0F-9 z=dy@mGLPJ92GY7O?Tl+L}*^w%{33XygavF`nK}*`Zo27zNGKc%S-(YAltRYV%Q+ z58n+izCD=Q**9{@UE-=w4UJr>YUgI2N%c854ncOAq?;#M1zI=Z|aoi;#pjtyOa7MIpxrq0u zaK63WXbcaBu9i;nS)P-Dw3(&D2Bm}MHs!Ad8Y;b_)Y+ zA*c0x73|Bz$_fibn)F~X-_#dF>KS`2wD{C;KuO2wI;SSedokHsHL6C(#B}O)2RE*H z!b_yqsC3TM`vw|t=omh=QC!`ZI@HsnA4R=Zl`^QOtSz1r6--{%!=(xBQ;z6hs(d4d z%G8{aS>;!y3*Lt(!C!Yy{PolLTQ4q5(sYs-Ovxm1xc9DW^$J2%jg*G=0V&Tm!1!48p;Z>557l$^t~5ua3cHFovLe-F*uFPg%c7UHP$wQ^#92}<-^O;VJG)OAtH4ZtmE7EUn3}kC$d}T7OZNEsvfp?pEQ;CS@qgCI_vok>-Bg z`%P2YbC)iUa6nm2qlNB`Swtzem|n5rqPt$u3vUe#Dcz{cN-9Jb$!7$9h>1#X5}!zA zZoMhNz@@l)IY(zuvybEI1OMSVJB_K*LvTzLns#L#Xbp?C(GchK?wp|(<&F!!5bZ6T*2~c3Q8C1Eg-g?&pZQY; zp*gD@%D7kObBkm{m~#8Fd_wxP?2^j8!uBEm5?h#Eo(O+p=@o5`^0>0{r+jK0T=q#C z(*{Kw+kLo~$Q?1G)oC1O_T^Cho}An5m{*D5W>7%R5@A(adYY zn}!r1GC2hMS>2HnEn@5daX(D0R4NdA;dX#ZmA2uFV_z z>-y17Pv=IL!MDeXMekm_QEaMJ)hOEMYCRe`t{ORtdSJcCI__Tj?9xbg5Hd@;8dV+S zr4!I?no~8G-`&t#k?hACeq$d=$Ak37Ib)T2-V=iohdJ6aI{L5rb`1DCNiTGVH7xbJ zbrl+(M01;R3ZPEji`S;g&x#La7*p%kI|q%u82bP)p*ja{>O%;S<-#c%Y)z6MSqxbi zWL}cm%ZKp(e4|{m{YVXAn6>SD7e21iQ$kl5{o;pF2XCq=(Am^oi*(la?IoC2KzJ*Gr5np)Dao zB`BKLeiF?_CalpF_BN@$f)MSaNI{)b?DP1cwdmpDkNx03M+#m)kn*|Xgad)&>-fMI zHCCHC55u+Y8acc!Mt+)~{-m$?I;di?&^zqil2UOvn<8m_E%)M$kozAKw>WE*!^0k? zOcth$OX@!NvOD9La`B!OJV;>h4Ze{L3Cih(G#{Mgfh$kQs8uT8-IU||3xm!IHi+}F zCmF#AVTAkh8cVE?HO3LpX9|g4C#)P|_9n6)FI`qKp}AwakfGdzQ4oAt*do#|1)(U9KFcuW# zF_6g?R?F8h=8iYZG&Ipa&h)`t|8_t2_2tPl>?%=Sqef|?ps(pi_b5}kK5z*M zyDp@Jx|$u1T|AonEG{$(qLTLIrqg%9^&{}98oS{1 zePKy%XBFvcwr10liOkxa<)d!8m3MiK>IQ=DQDKX?dIWX>K{4a5TJWtZSk9N8Mtwy^ n8K;|HN#M}fz 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 literal 0 HcmV?d00001 diff --git a/Tests/import_all.py b/Tests/import_all.py new file mode 100644 index 000000000..118bf69a7 --- /dev/null +++ b/Tests/import_all.py @@ -0,0 +1,13 @@ +import sys +sys.path.insert(0, ".") + +import glob, os +import traceback + +for file in glob.glob("PIL/*.py"): + module = os.path.basename(file)[:-3] + try: + exec("from PIL import " + module) + except (ImportError, SyntaxError): + print("===", "failed to import", module) + traceback.print_exc() diff --git a/Tests/make_hash.py b/Tests/make_hash.py new file mode 100644 index 000000000..7e1a1b2e1 --- /dev/null +++ b/Tests/make_hash.py @@ -0,0 +1,57 @@ +# brute-force search for access descriptor hash table + +import random + +modes = [ + "1", + "L", "LA", + "I", "I;16", "I;16L", "I;16B", "I;32L", "I;32B", + "F", + "P", "PA", + "RGB", "RGBA", "RGBa", "RGBX", + "CMYK", + "YCbCr", + ] + +def hash(s, i): + # djb2 hash: multiply by 33 and xor character + for c in s: + i = (((i<<5) + i) ^ ord(c)) & 0xffffffff + return i + +def check(size, i0): + h = [None] * size + for m in modes: + i = hash(m, i0) + i = i % size + if h[i]: + return 0 + h[i] = m + return h + +min_start = 0 + +# 1) find the smallest table size with no collisions +for min_size in range(len(modes), 16384): + if check(min_size, 0): + print(len(modes), "modes fit in", min_size, "slots") + break + +# 2) see if we can do better with a different initial value +for i0 in range(65556): + for size in range(1, min_size): + if check(size, i0): + if size < min_size: + print(len(modes), "modes fit in", size, "slots with start", i0) + min_size = size + min_start = i0 + +print() + +# print check(min_size, min_start) + +print("#define ACCESS_TABLE_SIZE", min_size) +print("#define ACCESS_TABLE_HASH", min_start) + +# for m in modes: +# print m, "=>", hash(m, min_start) % min_size diff --git a/Tests/run.py b/Tests/run.py new file mode 100644 index 000000000..27a7afa9f --- /dev/null +++ b/Tests/run.py @@ -0,0 +1,93 @@ +# minimal test runner + +import glob, os, sys + +try: + root = os.path.dirname(__file__) +except NameError: + root = os.path.dirname(sys.argv[0]) + +if not os.path.isfile("PIL/Image.py"): + print("***", "please run this script from the PIL development directory as") + print("***", "$ python Tests/run.py") + sys.exit(1) + +print("-"*68) + +python_options = [] +tester_options = [] + +if "--installed" not in sys.argv: + python_options.append("-S") + os.environ["PYTHONPATH"] = "." + +if "--coverage" in sys.argv: + tester_options.append("--coverage") + +if "--log" in sys.argv: + tester_options.append("--log") + +files = glob.glob(os.path.join(root, "test_*.py")) +files.sort() + +success = failure = 0 +include = [x for x in sys.argv[1:] if x[:2] != "--"] +skipped = [] + +python_options = " ".join(python_options) +tester_options = " ".join(tester_options) + +for file in files: + test, ext = os.path.splitext(os.path.basename(file)) + if include and test not in include: + continue + print("running", test, "...") + # 2>&1 works on unix and on modern windowses. we might care about + # very old Python versions, but not ancient microsoft products :-) + out = os.popen("%s %s -u %s %s 2>&1" % ( + sys.executable, python_options, file, tester_options + )) + result = out.read().strip() + if result == "ok": + result = None + elif result == "skip": + print("---", "skipped") # FIXME: driver should include a reason + skipped.append(test) + continue + elif not result: + result = "(no output)" + status = out.close() + if status or result: + if status: + print("=== error", status) + if result: + if result[-3:] == "\nok": + # if there's an ok at the end, it's not really ok + result = result[:-3] + print(result) + failure = failure + 1 + else: + success = success + 1 + +print("-"*68) + +tempfiles = glob.glob(os.path.join(root, "temp_*")) +if tempfiles: + print("===", "remaining temporary files") + for file in tempfiles: + print(file) + print("-"*68) + +def tests(n): + if n == 1: + return "1 test" + else: + return "%d tests" % n + +if skipped: + print("---", tests(len(skipped)), "skipped.") + print(skipped) +if failure: + print("***", tests(failure), "of", (success + failure), "failed.") +else: + print(tests(success), "passed.") diff --git a/Tests/show_icc.py b/Tests/show_icc.py new file mode 100644 index 000000000..e062747e7 --- /dev/null +++ b/Tests/show_icc.py @@ -0,0 +1,28 @@ +import sys +sys.path.insert(0, ".") + +from PIL import Image +from PIL import ImageCms + +try: + filename = sys.argv[1] +except IndexError: + filename = "../pil-archive/cmyk.jpg" + +i = Image.open(filename) + +print(i.format) +print(i.mode) +print(i.size) +print(i.tile) + +p = ImageCms.getMemoryProfile(i.info["icc_profile"]) + +print(repr(p.product_name)) +print(repr(p.product_info)) + +o = ImageCms.createProfile("sRGB") +t = ImageCms.buildTransformFromOpenProfiles(p, o, i.mode, "RGB") +i = ImageCms.applyTransform(i, t) + +i.show() diff --git a/Tests/show_mcidas.py b/Tests/show_mcidas.py new file mode 100644 index 000000000..db193b82a --- /dev/null +++ b/Tests/show_mcidas.py @@ -0,0 +1,26 @@ +import sys +sys.path.insert(0, ".") + +from PIL import Image +from PIL import ImageMath + +try: + filename = sys.argv[1] +except IndexError: + filename = "../pil-archive/goes12.2005.140.190925.BAND_01.mcidas" + # filename = "../pil-archive/goes12.2005.140.190925.BAND_01.im" + +im = Image.open(filename) + +print(im.format) +print(im.mode) +print(im.size) +print(im.tile) + +lo, hi = im.getextrema() + +print("map", lo, hi, "->", end=' ') +im = ImageMath.eval("convert(im*255/hi, 'L')", im=im, hi=hi) +print(im.getextrema()) + +im.show() diff --git a/Tests/test_000_sanity.py b/Tests/test_000_sanity.py new file mode 100644 index 000000000..cba99e4fe --- /dev/null +++ b/Tests/test_000_sanity.py @@ -0,0 +1,21 @@ +import PIL +import PIL.Image + +# Make sure we have the binary extension +im = PIL.Image.core.new("L", (100, 100)) + +assert PIL.Image.VERSION[:3] == '1.1' + +# Create an image and do stuff with it. +im = PIL.Image.new("1", (100, 100)) +assert (im.mode, im.size) == ('1', (100, 100)) +assert len(im.tobytes()) == 1300 + +# Create images in all remaining major modes. +im = PIL.Image.new("L", (100, 100)) +im = PIL.Image.new("P", (100, 100)) +im = PIL.Image.new("RGB", (100, 100)) +im = PIL.Image.new("I", (100, 100)) +im = PIL.Image.new("F", (100, 100)) + +print("ok") diff --git a/Tests/test_001_archive.py b/Tests/test_001_archive.py new file mode 100644 index 000000000..a914a6c4c --- /dev/null +++ b/Tests/test_001_archive.py @@ -0,0 +1,23 @@ +import PIL +import PIL.Image + +import glob, os + +for file in glob.glob("../pil-archive/*"): + f, e = os.path.splitext(file) + if e in [".txt", ".ttf", ".otf", ".zip"]: + continue + try: + im = PIL.Image.open(file) + im.load() + except IOError as v: + print("-", "failed to open", file, "-", v) + else: + print("+", file, im.mode, im.size, im.format) + if e == ".exif": + try: + info = im._getexif() + except KeyError as v: + print("-", "failed to get exif info from", file, "-", v) + +print("ok") diff --git a/Tests/test_contents.py b/Tests/test_contents.py new file mode 100644 index 000000000..0455ad89c --- /dev/null +++ b/Tests/test_contents.py @@ -0,0 +1,31 @@ +from tester import * + +import os, glob + +contents = {} +for file in open("CONTENTS"): + file = file.strip() + if file: + contents[os.path.normpath(file)] = None + +patterns = [ + "PIL/*.py", + "*.c", + "libImaging/*.c", + "libImaging/*.h", + ] + +def test_files(): + + for pattern in patterns: + for file in glob.glob(pattern): + file = os.path.normpath("Imaging/" + file) + assert_true(file in contents, "%r not in CONTENTS" % file) + +def test_contents(): + + for file in contents: + root, file = file.split(os.sep, 1) + if file == "MANIFEST": + continue # generated by distribution scripts + assert_true(os.path.isfile(file), "%r not found" % file) diff --git a/Tests/test_file_bmp.py b/Tests/test_file_bmp.py new file mode 100644 index 000000000..e0584641c --- /dev/null +++ b/Tests/test_file_bmp.py @@ -0,0 +1,27 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + file = tempfile("temp.bmp") + + lena().save(file) + + im = Image.open(file) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "BMP") + + lena("1").save(file) + im = Image.open(file) + + lena("L").save(file) + im = Image.open(file) + + lena("P").save(file) + im = Image.open(file) + + lena("RGB").save(file) + im = Image.open(file) diff --git a/Tests/test_file_gif.py b/Tests/test_file_gif.py new file mode 100644 index 000000000..336aaba63 --- /dev/null +++ b/Tests/test_file_gif.py @@ -0,0 +1,28 @@ +from tester import * + +from PIL import Image + +codecs = dir(Image.core) + +if "gif_encoder" not in codecs or "gif_decoder" not in codecs: + skip("gif support not available") # can this happen? + +# sample gif stream +file = "Images/lena.gif" +data = open(file, "rb").read() + +def test_sanity(): + im = Image.open(file) + im.load() + assert_equal(im.mode, "P") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "GIF") + +def test_optimize(): + def test(optimize): + im = Image.new("L", (1, 1), 0) + file = BytesIO() + im.save(file, "GIF", optimize=optimize) + return len(file.getvalue()) + assert_equal(test(0), 800) + assert_equal(test(1), 32) diff --git a/Tests/test_file_jpeg.py b/Tests/test_file_jpeg.py new file mode 100644 index 000000000..126c67237 --- /dev/null +++ b/Tests/test_file_jpeg.py @@ -0,0 +1,179 @@ +from tester import * + +from PIL import Image +from PIL import ImageFile + +codecs = dir(Image.core) + +if "jpeg_encoder" not in codecs or "jpeg_decoder" not in codecs: + skip("jpeg support not available") + +# sample jpeg stream +file = "Images/lena.jpg" +data = open(file, "rb").read() + +def roundtrip(im, **options): + out = BytesIO() + im.save(out, "JPEG", **options) + bytes = out.tell() + out.seek(0) + im = Image.open(out) + im.bytes = bytes # for testing only + return im + +# -------------------------------------------------------------------- + +def test_sanity(): + + # internal version number + assert_match(Image.core.jpeglib_version, "\d+\.\d+$") + + im = Image.open(file) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "JPEG") + +# -------------------------------------------------------------------- + +def test_app(): + # Test APP/COM reader (@PIL135) + im = Image.open(file) + assert_equal(im.applist[0], + ("APP0", b"JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00")) + assert_equal(im.applist[1], ("COM", b"Python Imaging Library")) + assert_equal(len(im.applist), 2) + +def test_cmyk(): + # Test CMYK handling. Thanks to Tim and Charlie for test data, + # Michael for getting me to look one more time. + file = "Tests/images/pil_sample_cmyk.jpg" + im = Image.open(file) + # the source image has red pixels in the upper left corner. + c, m, y, k = [x / 255.0 for x in im.getpixel((0, 0))] + assert_true(c == 0.0 and m > 0.8 and y > 0.8 and k == 0.0) + # the opposite corner is black + c, m, y, k = [x / 255.0 for x in im.getpixel((im.size[0]-1, im.size[1]-1))] + assert_true(k > 0.9) + # roundtrip, and check again + im = roundtrip(im) + c, m, y, k = [x / 255.0 for x in im.getpixel((0, 0))] + assert_true(c == 0.0 and m > 0.8 and y > 0.8 and k == 0.0) + c, m, y, k = [x / 255.0 for x in im.getpixel((im.size[0]-1, im.size[1]-1))] + assert_true(k > 0.9) + +def test_dpi(): + def test(xdpi, ydpi=None): + im = Image.open(file) + im = roundtrip(im, dpi=(xdpi, ydpi or xdpi)) + return im.info.get("dpi") + assert_equal(test(72), (72, 72)) + assert_equal(test(300), (300, 300)) + assert_equal(test(100, 200), (100, 200)) + assert_equal(test(0), None) # square pixels + +def test_icc(): + # Test ICC support + im1 = Image.open("Tests/images/rgb.jpg") + icc_profile = im1.info["icc_profile"] + assert_equal(len(icc_profile), 3144) + # Roundtrip via physical file. + file = tempfile("temp.jpg") + im1.save(file, icc_profile=icc_profile) + im2 = Image.open(file) + assert_equal(im2.info.get("icc_profile"), icc_profile) + # Roundtrip via memory buffer. + im1 = roundtrip(lena()) + im2 = roundtrip(lena(), icc_profile=icc_profile) + assert_image_equal(im1, im2) + assert_false(im1.info.get("icc_profile")) + assert_true(im2.info.get("icc_profile")) + +def test_icc_big(): + # Make sure that the "extra" support handles large blocks + def test(n): + # The ICC APP marker can store 65519 bytes per marker, so + # using a 4-byte test code should allow us to detect out of + # order issues. + icc_profile = (b"Test"*int(n/4+1))[:n] + assert len(icc_profile) == n # sanity + im1 = roundtrip(lena(), icc_profile=icc_profile) + assert_equal(im1.info.get("icc_profile"), icc_profile or None) + test(0); test(1) + test(3); test(4); test(5) + test(65533-14) # full JPEG marker block + test(65533-14+1) # full block plus one byte + test(ImageFile.MAXBLOCK) # full buffer block + test(ImageFile.MAXBLOCK+1) # full buffer block plus one byte + test(ImageFile.MAXBLOCK*4+3) # large block + +def test_optimize(): + im1 = roundtrip(lena()) + im2 = roundtrip(lena(), optimize=1) + assert_image_equal(im1, im2) + assert_true(im1.bytes >= im2.bytes) + +def test_progressive(): + im1 = roundtrip(lena()) + im2 = roundtrip(lena(), progressive=1) + im3 = roundtrip(lena(), progression=1) # compatibility + assert_image_equal(im1, im2) + assert_image_equal(im1, im3) + assert_false(im1.info.get("progressive")) + assert_false(im1.info.get("progression")) + assert_true(im2.info.get("progressive")) + assert_true(im2.info.get("progression")) + assert_true(im3.info.get("progressive")) + assert_true(im3.info.get("progression")) + +def test_quality(): + im1 = roundtrip(lena()) + im2 = roundtrip(lena(), quality=50) + assert_image(im1, im2.mode, im2.size) + assert_true(im1.bytes >= im2.bytes) + +def test_smooth(): + im1 = roundtrip(lena()) + im2 = roundtrip(lena(), smooth=100) + assert_image(im1, im2.mode, im2.size) + +def test_subsampling(): + def getsampling(im): + layer = im.layer + return layer[0][1:3] + layer[1][1:3] + layer[2][1:3] + # experimental API + im = roundtrip(lena(), subsampling=-1) # default + assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling=0) # 4:4:4 + assert_equal(getsampling(im), (1, 1, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling=1) # 4:2:2 + assert_equal(getsampling(im), (2, 1, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling=2) # 4:1:1 + assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling=3) # default (undefined) + assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) + + im = roundtrip(lena(), subsampling="4:4:4") + assert_equal(getsampling(im), (1, 1, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling="4:2:2") + assert_equal(getsampling(im), (2, 1, 1, 1, 1, 1)) + im = roundtrip(lena(), subsampling="4:1:1") + assert_equal(getsampling(im), (2, 2, 1, 1, 1, 1)) + + assert_exception(TypeError, lambda: roundtrip(lena(), subsampling="1:1:1")) + +def test_truncated_jpeg(): + def test(junk): + if junk: + # replace "junk" bytes at the end with junk + file = BytesIO(data[:-junk] + bytes(junk*[0])) + else: + file = BytesIO(data) + im = Image.open(file) + im.load() + assert_no_exception(lambda: test(0)) + assert_exception(IOError, lambda: test(1)) + assert_no_exception(lambda: test(2)) + assert_no_exception(lambda: test(4)) + assert_no_exception(lambda: test(8)) + assert_exception(IOError, lambda: test(10)) diff --git a/Tests/test_file_msp.py b/Tests/test_file_msp.py new file mode 100644 index 000000000..7ed200e43 --- /dev/null +++ b/Tests/test_file_msp.py @@ -0,0 +1,15 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + file = tempfile("temp.msp") + + lena("1").save(file) + + im = Image.open(file) + im.load() + assert_equal(im.mode, "1") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "MSP") diff --git a/Tests/test_file_pcx.py b/Tests/test_file_pcx.py new file mode 100644 index 000000000..73d358229 --- /dev/null +++ b/Tests/test_file_pcx.py @@ -0,0 +1,39 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + file = tempfile("temp.pcx") + + lena("1").save(file) + + im = Image.open(file) + im.load() + assert_equal(im.mode, "1") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "PCX") + + lena("1").save(file) + im = Image.open(file) + + lena("L").save(file) + im = Image.open(file) + + lena("P").save(file) + im = Image.open(file) + + lena("RGB").save(file) + im = Image.open(file) + +def test_pil184(): + # Check reading of files where xmin/xmax is not zero. + + file = "Tests/images/pil184.pcx" + im = Image.open(file) + + assert_equal(im.size, (447, 144)) + assert_equal(im.tile[0][1], (0, 0, 447, 144)) + + # Make sure all pixels are either 0 or 255. + assert_equal(im.histogram()[0] + im.histogram()[255], 447*144) diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py new file mode 100644 index 000000000..329598c9d --- /dev/null +++ b/Tests/test_file_png.py @@ -0,0 +1,170 @@ +from tester import * + +from PIL import Image +from PIL import PngImagePlugin + +codecs = dir(Image.core) + +if "zip_encoder" not in codecs or "zip_decoder" not in codecs: + skip("zip/deflate support not available") + +# sample png stream + +file = "Images/lena.png" +data = open(file, "rb").read() + +# stuff to create inline PNG images + +MAGIC = PngImagePlugin._MAGIC + +def chunk(cid, *data): + file = BytesIO() + PngImagePlugin.putchunk(*(file, cid) + data) + return file.getvalue() + +o32 = PngImagePlugin.o32 + +IHDR = chunk(b"IHDR", o32(1), o32(1), bytes((8,2)), bytes((0,0,0))) +IDAT = chunk(b"IDAT") +IEND = chunk(b"IEND") + +HEAD = MAGIC + IHDR +TAIL = IDAT + IEND + +def load(data): + return Image.open(BytesIO(data)) + +def roundtrip(im, **options): + out = BytesIO() + im.save(out, "PNG", **options) + out.seek(0) + return Image.open(out) + +# -------------------------------------------------------------------- + +def test_sanity(): + + # internal version number + assert_match(Image.core.zlib_version, "\d+\.\d+\.\d+(\.\d+)?$") + + file = tempfile("temp.png") + + lena("RGB").save(file) + + im = Image.open(file) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "PNG") + + lena("1").save(file) + im = Image.open(file) + + lena("L").save(file) + im = Image.open(file) + + lena("P").save(file) + im = Image.open(file) + + lena("RGB").save(file) + im = Image.open(file) + + lena("I").save(file) + im = Image.open(file) + +# -------------------------------------------------------------------- + +def test_broken(): + # Check reading of totally broken files. In this case, the test + # file was checked into Subversion as a text file. + + file = "Tests/images/broken.png" + assert_exception(IOError, lambda: Image.open(file)) + +def test_bad_text(): + # Make sure PIL can read malformed tEXt chunks (@PIL152) + + im = load(HEAD + chunk(b'tEXt') + TAIL) + assert_equal(im.info, {}) + + im = load(HEAD + chunk(b'tEXt', b'spam') + TAIL) + assert_equal(im.info, {b'spam': b''}) + + im = load(HEAD + chunk(b'tEXt', b'spam\0') + TAIL) + assert_equal(im.info, {b'spam': b''}) + + im = load(HEAD + chunk(b'tEXt', b'spam\0egg') + TAIL) + assert_equal(im.info, {b'spam': b'egg'}) + + im = load(HEAD + chunk(b'tEXt', b'spam\0egg\0') + TAIL) + assert_equal(im.info, {b'spam': b'egg\x00'}) + +def test_interlace(): + + file = "Tests/images/pil123p.png" + im = Image.open(file) + + assert_image(im, "P", (162, 150)) + assert_true(im.info.get("interlace")) + + assert_no_exception(lambda: im.load()) + + file = "Tests/images/pil123rgba.png" + im = Image.open(file) + + assert_image(im, "RGBA", (162, 150)) + assert_true(im.info.get("interlace")) + + assert_no_exception(lambda: im.load()) + +def test_load_verify(): + # Check open/load/verify exception (@PIL150) + + im = Image.open("Images/lena.png") + assert_no_exception(lambda: im.verify()) + + im = Image.open("Images/lena.png") + im.load() + assert_exception(RuntimeError, lambda: im.verify()) + +def test_roundtrip_dpi(): + # Check dpi roundtripping + + im = Image.open(file) + + im = roundtrip(im, dpi=(100, 100)) + assert_equal(im.info["dpi"], (100, 100)) + +def test_roundtrip_text(): + # Check text roundtripping + + im = Image.open(file) + + info = PngImagePlugin.PngInfo() + info.add_text(b"TXT", b"VALUE") + info.add_text(b"ZIP", b"VALUE", 1) + + im = roundtrip(im, pnginfo=info) + assert_equal(im.info, {b'TXT': b'VALUE', b'ZIP': b'VALUE'}) + assert_equal(im.text, {b'TXT': b'VALUE', b'ZIP': b'VALUE'}) + +def test_scary(): + # Check reading of evil PNG file. For information, see: + # http://scary.beasts.org/security/CESA-2004-001.txt + + import base64 + file = "Tests/images/pngtest_bad.png.base64" + data = base64.decodebytes(open(file, 'rb').read()) + file = BytesIO(data) + assert_exception(IOError, lambda: Image.open(file)) + +def test_trns_rgb(): + # Check writing and reading of tRNS chunks for RGB images. + # Independent file sample provided by Sebastian Spaeth. + + file = "Tests/images/caption_6_33_22.png" + im = Image.open(file) + assert_equal(im.info["transparency"], (248, 248, 248)) + + im = roundtrip(im, transparency=(0, 1, 2)) + assert_equal(im.info["transparency"], (0, 1, 2)) diff --git a/Tests/test_file_ppm.py b/Tests/test_file_ppm.py new file mode 100644 index 000000000..fccb94905 --- /dev/null +++ b/Tests/test_file_ppm.py @@ -0,0 +1,14 @@ +from tester import * + +from PIL import Image + +# sample ppm stream +file = "Images/lena.ppm" +data = open(file, "rb").read() + +def test_sanity(): + im = Image.open(file) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "PPM") diff --git a/Tests/test_file_tiff.py b/Tests/test_file_tiff.py new file mode 100644 index 000000000..843e13d28 --- /dev/null +++ b/Tests/test_file_tiff.py @@ -0,0 +1,57 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + file = tempfile("temp.tif") + + lena("RGB").save(file) + + im = Image.open(file) + im.load() + assert_equal(im.mode, "RGB") + assert_equal(im.size, (128, 128)) + assert_equal(im.format, "TIFF") + + lena("1").save(file) + im = Image.open(file) + + lena("L").save(file) + im = Image.open(file) + + lena("P").save(file) + im = Image.open(file) + + lena("RGB").save(file) + im = Image.open(file) + + lena("I").save(file) + im = Image.open(file) + +def test_mac_tiff(): + # Read RGBa images from Mac OS X [@PIL136] + + file = "Tests/images/pil136.tiff" + im = Image.open(file) + + assert_equal(im.mode, "RGBA") + assert_equal(im.size, (55, 43)) + assert_equal(im.tile, [('raw', (0, 0, 55, 43), 8, ('RGBa', 0, 1))]) + assert_no_exception(lambda: im.load()) + +def test_gimp_tiff(): + # Read TIFF JPEG images from GIMP [@PIL168] + + file = "Tests/images/pil168.tif" + im = Image.open(file) + + assert_equal(im.mode, "RGB") + assert_equal(im.size, (256, 256)) + assert_equal(im.tile, [ + ('jpeg', (0, 0, 256, 64), 8, ('RGB', '')), + ('jpeg', (0, 64, 256, 128), 1215, ('RGB', '')), + ('jpeg', (0, 128, 256, 192), 2550, ('RGB', '')), + ('jpeg', (0, 192, 256, 256), 3890, ('RGB', '')), + ]) + assert_no_exception(lambda: im.load()) diff --git a/Tests/test_file_xbm.py b/Tests/test_file_xbm.py new file mode 100644 index 000000000..f27a3a349 --- /dev/null +++ b/Tests/test_file_xbm.py @@ -0,0 +1,34 @@ +from tester import * + +from PIL import Image + +PIL151 = b""" +#define basic_width 32 +#define basic_height 32 +static char basic_bits[] = { +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x80, 0xff, 0xff, 0x01, 0x40, 0x00, 0x00, 0x02, +0x20, 0x00, 0x00, 0x04, 0x20, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x08, +0x10, 0x00, 0x00, 0x08, +0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, +0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x08, +0x20, 0x00, 0x00, 0x04, +0x20, 0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x02, +0x80, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, +}; +""" + +def test_pil151(): + + im = Image.open(BytesIO(PIL151)) + + assert_no_exception(lambda: im.load()) + assert_equal(im.mode, '1') + assert_equal(im.size, (32, 32)) diff --git a/Tests/test_font_bdf.py b/Tests/test_font_bdf.py new file mode 100644 index 000000000..366bb4468 --- /dev/null +++ b/Tests/test_font_bdf.py @@ -0,0 +1,13 @@ +from tester import * + +from PIL import Image, FontFile, BdfFontFile + +filename = "Images/courB08.bdf" + +def test_sanity(): + + file = open(filename, "rb") + font = BdfFontFile.BdfFontFile(file) + + assert_true(isinstance(font, FontFile.FontFile)) + assert_equal(len([_f for _f in font.glyph if _f]), 190) diff --git a/Tests/test_font_pcf.py b/Tests/test_font_pcf.py new file mode 100644 index 000000000..958657eaa --- /dev/null +++ b/Tests/test_font_pcf.py @@ -0,0 +1,26 @@ +from tester import * + +from PIL import Image, FontFile, PcfFontFile +from PIL import ImageFont, ImageDraw + +fontname = "Tests/fonts/helvO18.pcf" +tempname = tempfile("temp.pil", "temp.pbm") + +message = "hello, world" + +def test_sanity(): + + file = open(fontname, "rb") + font = PcfFontFile.PcfFontFile(file) + assert_true(isinstance(font, FontFile.FontFile)) + assert_equal(len([_f for _f in font.glyph if _f]), 192) + + font.save(tempname) + +def test_draw(): + + font = ImageFont.load(tempname) + image = Image.new("L", font.getsize(message), "white") + draw = ImageDraw.Draw(image) + draw.text((0, 0), message, font=font) + # assert_signature(image, "7216c60f988dea43a46bb68321e3c1b03ec62aee") diff --git a/Tests/test_image.py b/Tests/test_image.py new file mode 100644 index 000000000..cb1de08d5 --- /dev/null +++ b/Tests/test_image.py @@ -0,0 +1,39 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + im = Image.new("L", (100, 100)) + assert_equal(repr(im)[:45], " 2**32: + assert_equal(put(sys.maxsize), (255, 255, 255, 255)) + else: + assert_equal(put(sys.maxsize), (255, 255, 255, 127)) diff --git a/Tests/test_image_putpalette.py b/Tests/test_image_putpalette.py new file mode 100644 index 000000000..b7ebb8853 --- /dev/null +++ b/Tests/test_image_putpalette.py @@ -0,0 +1,28 @@ +from tester import * + +from PIL import Image +from PIL import ImagePalette + +def test_putpalette(): + def palette(mode): + im = lena(mode).copy() + im.putpalette(list(range(256))*3) + p = im.getpalette() + if p: + return im.mode, p[:10] + return im.mode + assert_exception(ValueError, lambda: palette("1")) + assert_equal(palette("L"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) + assert_equal(palette("P"), ("P", [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])) + assert_exception(ValueError, lambda: palette("I")) + assert_exception(ValueError, lambda: palette("F")) + assert_exception(ValueError, lambda: palette("RGB")) + assert_exception(ValueError, lambda: palette("RGBA")) + assert_exception(ValueError, lambda: palette("YCbCr")) + +def test_imagepalette(): + im = lena("P") + assert_no_exception(lambda: im.putpalette(ImagePalette.negative())) + assert_no_exception(lambda: im.putpalette(ImagePalette.random())) + assert_no_exception(lambda: im.putpalette(ImagePalette.sepia())) + assert_no_exception(lambda: im.putpalette(ImagePalette.wedge())) diff --git a/Tests/test_image_putpixel.py b/Tests/test_image_putpixel.py new file mode 100644 index 000000000..555a92f74 --- /dev/null +++ b/Tests/test_image_putpixel.py @@ -0,0 +1,43 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + im1 = lena() + im2 = Image.new(im1.mode, im1.size, 0) + + for y in range(im1.size[1]): + for x in range(im1.size[0]): + pos = x, y + im2.putpixel(pos, im1.getpixel(pos)) + + assert_image_equal(im1, im2) + + im2 = Image.new(im1.mode, im1.size, 0) + im2.readonly = 1 + + for y in range(im1.size[1]): + for x in range(im1.size[0]): + pos = x, y + im2.putpixel(pos, im1.getpixel(pos)) + + assert_false(im2.readonly) + assert_image_equal(im1, im2) + + im2 = Image.new(im1.mode, im1.size, 0) + + pix1 = im1.load() + pix2 = im2.load() + + for y in range(im1.size[1]): + for x in range(im1.size[0]): + pix2[x, y] = pix1[x, y] + + assert_image_equal(im1, im2) + + + + +# see test_image_getpixel for more tests + diff --git a/Tests/test_image_quantize.py b/Tests/test_image_quantize.py new file mode 100644 index 000000000..5dcbab7fe --- /dev/null +++ b/Tests/test_image_quantize.py @@ -0,0 +1,15 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + im = lena() + + im = im.quantize() + assert_image(im, "P", im.size) + + im = lena() + im = im.quantize(palette=lena("P")) + assert_image(im, "P", im.size) + diff --git a/Tests/test_image_resize.py b/Tests/test_image_resize.py new file mode 100644 index 000000000..4e228a396 --- /dev/null +++ b/Tests/test_image_resize.py @@ -0,0 +1,12 @@ +from tester import * + +from PIL import Image + +def test_resize(): + def resize(mode, size): + out = lena(mode).resize(size) + assert_equal(out.mode, mode) + assert_equal(out.size, size) + for mode in "1", "P", "L", "RGB", "I", "F": + yield_test(resize, mode, (100, 100)) + yield_test(resize, mode, (200, 200)) diff --git a/Tests/test_image_rotate.py b/Tests/test_image_rotate.py new file mode 100644 index 000000000..5e4782c87 --- /dev/null +++ b/Tests/test_image_rotate.py @@ -0,0 +1,15 @@ +from tester import * + +from PIL import Image + +def test_rotate(): + def rotate(mode): + im = lena(mode) + out = im.rotate(45) + assert_equal(out.mode, mode) + assert_equal(out.size, im.size) # default rotate clips output + out = im.rotate(45, expand=1) + assert_equal(out.mode, mode) + assert_true(out.size != im.size) + for mode in "1", "P", "L", "RGB", "I", "F": + yield_test(rotate, mode) diff --git a/Tests/test_image_save.py b/Tests/test_image_save.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_save.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_image_seek.py b/Tests/test_image_seek.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_seek.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_image_show.py b/Tests/test_image_show.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_show.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_image_split.py b/Tests/test_image_split.py new file mode 100644 index 000000000..7fc70182b --- /dev/null +++ b/Tests/test_image_split.py @@ -0,0 +1,42 @@ +from tester import * + +from PIL import Image + +def test_split(): + def split(mode): + layers = lena(mode).split() + return [(i.mode, i.size[0], i.size[1]) for i in layers] + assert_equal(split("1"), [('1', 128, 128)]) + assert_equal(split("L"), [('L', 128, 128)]) + assert_equal(split("I"), [('I', 128, 128)]) + assert_equal(split("F"), [('F', 128, 128)]) + assert_equal(split("P"), [('P', 128, 128)]) + assert_equal(split("RGB"), [('L', 128, 128), ('L', 128, 128), ('L', 128, 128)]) + assert_equal(split("RGBA"), [('L', 128, 128), ('L', 128, 128), ('L', 128, 128), ('L', 128, 128)]) + assert_equal(split("CMYK"), [('L', 128, 128), ('L', 128, 128), ('L', 128, 128), ('L', 128, 128)]) + assert_equal(split("YCbCr"), [('L', 128, 128), ('L', 128, 128), ('L', 128, 128)]) + +def test_split_merge(): + def split_merge(mode): + return Image.merge(mode, lena(mode).split()) + assert_image_equal(lena("1"), split_merge("1")) + assert_image_equal(lena("L"), split_merge("L")) + assert_image_equal(lena("I"), split_merge("I")) + assert_image_equal(lena("F"), split_merge("F")) + assert_image_equal(lena("P"), split_merge("P")) + assert_image_equal(lena("RGB"), split_merge("RGB")) + assert_image_equal(lena("RGBA"), split_merge("RGBA")) + assert_image_equal(lena("CMYK"), split_merge("CMYK")) + assert_image_equal(lena("YCbCr"), split_merge("YCbCr")) + +def test_split_open(): + file = tempfile("temp.png") + def split_open(mode): + lena(mode).save(file) + im = Image.open(file) + return len(im.split()) + assert_equal(split_open("1"), 1) + assert_equal(split_open("L"), 1) + assert_equal(split_open("P"), 1) + assert_equal(split_open("RGB"), 3) + assert_equal(split_open("RGBA"), 4) diff --git a/Tests/test_image_tell.py b/Tests/test_image_tell.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_tell.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_image_thumbnail.py b/Tests/test_image_thumbnail.py new file mode 100644 index 000000000..871dd1f54 --- /dev/null +++ b/Tests/test_image_thumbnail.py @@ -0,0 +1,36 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + im = lena() + im.thumbnail((100, 100)) + + assert_image(im, im.mode, (100, 100)) + +def test_aspect(): + + im = lena() + im.thumbnail((100, 100)) + assert_image(im, im.mode, (100, 100)) + + im = lena().resize((128, 256)) + im.thumbnail((100, 100)) + assert_image(im, im.mode, (50, 100)) + + im = lena().resize((128, 256)) + im.thumbnail((50, 100)) + assert_image(im, im.mode, (50, 100)) + + im = lena().resize((256, 128)) + im.thumbnail((100, 100)) + assert_image(im, im.mode, (100, 50)) + + im = lena().resize((256, 128)) + im.thumbnail((100, 50)) + assert_image(im, im.mode, (100, 50)) + + im = lena().resize((128, 128)) + im.thumbnail((100, 100)) + assert_image(im, im.mode, (100, 100)) diff --git a/Tests/test_image_tobitmap.py b/Tests/test_image_tobitmap.py new file mode 100644 index 000000000..f8186ae14 --- /dev/null +++ b/Tests/test_image_tobitmap.py @@ -0,0 +1,15 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + assert_exception(ValueError, lambda: lena().tobitmap()) + assert_no_exception(lambda: lena().convert("1").tobitmap()) + + im1 = lena().convert("1") + + bitmap = im1.tobitmap() + + assert_true(isinstance(bitmap, bytes)) + assert_image_equal(im1, fromstring(bitmap)) diff --git a/Tests/test_image_tostring.py b/Tests/test_image_tostring.py new file mode 100644 index 000000000..b992b63c6 --- /dev/null +++ b/Tests/test_image_tostring.py @@ -0,0 +1,8 @@ +from tester import * + +from PIL import Image + +def test_sanity(): + + data = lena().tobytes() + assert_true(isinstance(data, bytes)) diff --git a/Tests/test_image_transform.py b/Tests/test_image_transform.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_transform.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_image_transpose.py b/Tests/test_image_transpose.py new file mode 100644 index 000000000..010478df4 --- /dev/null +++ b/Tests/test_image_transpose.py @@ -0,0 +1,34 @@ +from tester import * + +from PIL import Image + +FLIP_LEFT_RIGHT = Image.FLIP_LEFT_RIGHT +FLIP_TOP_BOTTOM = Image.FLIP_TOP_BOTTOM +ROTATE_90 = Image.ROTATE_90 +ROTATE_180 = Image.ROTATE_180 +ROTATE_270 = Image.ROTATE_270 + +def test_sanity(): + + im = lena() + + assert_no_exception(lambda: im.transpose(FLIP_LEFT_RIGHT)) + assert_no_exception(lambda: im.transpose(FLIP_TOP_BOTTOM)) + + assert_no_exception(lambda: im.transpose(ROTATE_90)) + assert_no_exception(lambda: im.transpose(ROTATE_180)) + assert_no_exception(lambda: im.transpose(ROTATE_270)) + +def test_roundtrip(): + + im = lena() + + def transpose(first, second): + return im.transpose(first).transpose(second) + + assert_image_equal(im, transpose(FLIP_LEFT_RIGHT, FLIP_LEFT_RIGHT)) + assert_image_equal(im, transpose(FLIP_TOP_BOTTOM, FLIP_TOP_BOTTOM)) + + assert_image_equal(im, transpose(ROTATE_90, ROTATE_270)) + assert_image_equal(im, transpose(ROTATE_180, ROTATE_180)) + diff --git a/Tests/test_image_verify.py b/Tests/test_image_verify.py new file mode 100644 index 000000000..7d4b6d9b3 --- /dev/null +++ b/Tests/test_image_verify.py @@ -0,0 +1,5 @@ +from tester import * + +from PIL import Image + +success() diff --git a/Tests/test_imagechops.py b/Tests/test_imagechops.py new file mode 100644 index 000000000..16eaaf55e --- /dev/null +++ b/Tests/test_imagechops.py @@ -0,0 +1,56 @@ +from tester import * + +from PIL import Image +from PIL import ImageChops + +def test_sanity(): + + im = lena("L") + + ImageChops.constant(im, 128) + ImageChops.duplicate(im) + ImageChops.invert(im) + ImageChops.lighter(im, im) + ImageChops.darker(im, im) + ImageChops.difference(im, im) + ImageChops.multiply(im, im) + ImageChops.screen(im, im) + + ImageChops.add(im, im) + ImageChops.add(im, im, 2.0) + ImageChops.add(im, im, 2.0, 128) + ImageChops.subtract(im, im) + ImageChops.subtract(im, im, 2.0) + ImageChops.subtract(im, im, 2.0, 128) + + ImageChops.add_modulo(im, im) + ImageChops.subtract_modulo(im, im) + + ImageChops.blend(im, im, 0.5) + ImageChops.composite(im, im, im) + + ImageChops.offset(im, 10) + ImageChops.offset(im, 10, 20) + +def test_logical(): + + def table(op, a, b): + out = [] + for x in (a, b): + imx = Image.new("1", (1, 1), x) + for y in (a, b): + imy = Image.new("1", (1, 1), y) + out.append(op(imx, imy).getpixel((0, 0))) + return tuple(out) + + assert_equal(table(ImageChops.logical_and, 0, 1), (0, 0, 0, 255)) + assert_equal(table(ImageChops.logical_or, 0, 1), (0, 255, 255, 255)) + assert_equal(table(ImageChops.logical_xor, 0, 1), (0, 255, 255, 0)) + + assert_equal(table(ImageChops.logical_and, 0, 128), (0, 0, 0, 255)) + assert_equal(table(ImageChops.logical_or, 0, 128), (0, 255, 255, 255)) + assert_equal(table(ImageChops.logical_xor, 0, 128), (0, 255, 255, 0)) + + assert_equal(table(ImageChops.logical_and, 0, 255), (0, 0, 0, 255)) + assert_equal(table(ImageChops.logical_or, 0, 255), (0, 255, 255, 255)) + assert_equal(table(ImageChops.logical_xor, 0, 255), (0, 255, 255, 0)) diff --git a/Tests/test_imagecms.py b/Tests/test_imagecms.py new file mode 100644 index 000000000..29e578192 --- /dev/null +++ b/Tests/test_imagecms.py @@ -0,0 +1,82 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageCms +except ImportError: + skip() + +SRGB = "Tests/icc/sRGB.icm" + +def test_sanity(): + + # basic smoke test. + # this mostly follows the cms_test outline. + + v = ImageCms.versions() # should return four strings + assert_equal(v[0], '0.1.0 pil') + assert_equal(list(map(type, v)), [str, str, str, str]) + + # internal version number + assert_match(ImageCms.core.littlecms_version, "\d+\.\d+$") + + i = ImageCms.profileToProfile(lena(), SRGB, SRGB) + assert_image(i, "RGB", (128, 128)) + + t = ImageCms.buildTransform(SRGB, SRGB, "RGB", "RGB") + i = ImageCms.applyTransform(lena(), t) + assert_image(i, "RGB", (128, 128)) + + p = ImageCms.createProfile("sRGB") + o = ImageCms.getOpenProfile(SRGB) + t = ImageCms.buildTransformFromOpenProfiles(p, o, "RGB", "RGB") + i = ImageCms.applyTransform(lena(), t) + assert_image(i, "RGB", (128, 128)) + + t = ImageCms.buildProofTransform(SRGB, SRGB, SRGB, "RGB", "RGB") + assert_equal(t.inputMode, "RGB") + assert_equal(t.outputMode, "RGB") + i = ImageCms.applyTransform(lena(), t) + assert_image(i, "RGB", (128, 128)) + + # get profile information for file + assert_equal(ImageCms.getProfileName(SRGB).strip(), + 'IEC 61966-2.1 Default RGB colour space - sRGB') + assert_equal(ImageCms.getProfileInfo(SRGB).splitlines(), + ['sRGB IEC61966-2.1', '', + 'Copyright (c) 1998 Hewlett-Packard Company', '', + 'WhitePoint : D65 (daylight)', '', + 'Tests/icc/sRGB.icm']) + assert_equal(ImageCms.getDefaultIntent(SRGB), 0) + assert_equal(ImageCms.isIntentSupported( + SRGB, ImageCms.INTENT_ABSOLUTE_COLORIMETRIC, + ImageCms.DIRECTION_INPUT), 1) + + # same, using profile object + p = ImageCms.createProfile("sRGB") + assert_equal(ImageCms.getProfileName(p).strip(), + 'sRGB built-in - (lcms internal)') + assert_equal(ImageCms.getProfileInfo(p).splitlines(), + ['sRGB built-in', '', 'WhitePoint : D65 (daylight)', '', '']) + assert_equal(ImageCms.getDefaultIntent(p), 0) + assert_equal(ImageCms.isIntentSupported( + p, ImageCms.INTENT_ABSOLUTE_COLORIMETRIC, + ImageCms.DIRECTION_INPUT), 1) + + # extensions + i = Image.open("Tests/images/rgb.jpg") + p = ImageCms.getOpenProfile(BytesIO(i.info["icc_profile"])) + assert_equal(ImageCms.getProfileName(p).strip(), + 'IEC 61966-2.1 Default RGB colour space - sRGB') + + # the procedural pyCMS API uses PyCMSError for all sorts of errors + assert_exception(ImageCms.PyCMSError, lambda: ImageCms.profileToProfile(lena(), "foo", "bar")) + assert_exception(ImageCms.PyCMSError, lambda: ImageCms.buildTransform("foo", "bar", "RGB", "RGB")) + assert_exception(ImageCms.PyCMSError, lambda: ImageCms.getProfileName(None)) + assert_exception(ImageCms.PyCMSError, lambda: ImageCms.isIntentSupported(SRGB, None, None)) + + # test PointTransform convenience API + im = lena().point(t) + + # try fetching the profile for the current display device + assert_no_exception(lambda: ImageCms.get_display_profile()) diff --git a/Tests/test_imagecolor.py b/Tests/test_imagecolor.py new file mode 100644 index 000000000..534005fe4 --- /dev/null +++ b/Tests/test_imagecolor.py @@ -0,0 +1,31 @@ +from tester import * + +from PIL import Image +from PIL import ImageColor + +# -------------------------------------------------------------------- +# sanity + +assert_equal((255, 0, 0), ImageColor.getrgb("#f00")) +assert_equal((255, 0, 0), ImageColor.getrgb("#ff0000")) +assert_equal((255, 0, 0), ImageColor.getrgb("rgb(255,0,0)")) +assert_equal((255, 0, 0), ImageColor.getrgb("rgb(100%,0%,0%)")) +assert_equal((255, 0, 0), ImageColor.getrgb("hsl(0, 100%, 50%)")) +assert_equal((255, 0, 0), ImageColor.getrgb("red")) + +# -------------------------------------------------------------------- +# look for rounding errors (based on code by Tim Hatch) + +for color in list(ImageColor.colormap.keys()): + expected = Image.new("RGB", (1, 1), color).convert("L").getpixel((0, 0)) + actual = Image.new("L", (1, 1), color).getpixel((0, 0)) + assert_equal(expected, actual) + +assert_equal((0, 0, 0), ImageColor.getcolor("black", "RGB")) +assert_equal((255, 255, 255), ImageColor.getcolor("white", "RGB")) + +assert_equal(0, ImageColor.getcolor("black", "L")) +assert_equal(255, ImageColor.getcolor("white", "L")) + +assert_equal(0, ImageColor.getcolor("black", "1")) +assert_equal(255, ImageColor.getcolor("white", "1")) diff --git a/Tests/test_imagedraw.py b/Tests/test_imagedraw.py new file mode 100644 index 000000000..c6fd20f52 --- /dev/null +++ b/Tests/test_imagedraw.py @@ -0,0 +1,28 @@ +from tester import * + +from PIL import Image +from PIL import ImageDraw + +def test_sanity(): + + im = lena("RGB").copy() + + draw = ImageDraw.ImageDraw(im) + draw = ImageDraw.Draw(im) + + draw.ellipse(list(range(4))) + draw.line(list(range(10))) + draw.polygon(list(range(100))) + draw.rectangle(list(range(4))) + + success() + +def test_deprecated(): + + im = lena().copy() + + draw = ImageDraw.Draw(im) + + assert_warning(DeprecationWarning, lambda: draw.setink(0)) + assert_warning(DeprecationWarning, lambda: draw.setfill(0)) + diff --git a/Tests/test_imageenhance.py b/Tests/test_imageenhance.py new file mode 100644 index 000000000..04f16bfa5 --- /dev/null +++ b/Tests/test_imageenhance.py @@ -0,0 +1,19 @@ +from tester import * + +from PIL import Image +from PIL import ImageEnhance + +def test_sanity(): + + # FIXME: assert_image + assert_no_exception(lambda: ImageEnhance.Color(lena()).enhance(0.5)) + assert_no_exception(lambda: ImageEnhance.Contrast(lena()).enhance(0.5)) + assert_no_exception(lambda: ImageEnhance.Brightness(lena()).enhance(0.5)) + assert_no_exception(lambda: ImageEnhance.Sharpness(lena()).enhance(0.5)) + +def test_crash(): + + # crashes on small images + im = Image.new("RGB", (1, 1)) + assert_no_exception(lambda: ImageEnhance.Sharpness(im).enhance(0.5)) + diff --git a/Tests/test_imagefile.py b/Tests/test_imagefile.py new file mode 100644 index 000000000..e260a24dd --- /dev/null +++ b/Tests/test_imagefile.py @@ -0,0 +1,61 @@ +from tester import * + +from PIL import Image +from PIL import ImageFile + +# save original block sizes +MAXBLOCK = ImageFile.MAXBLOCK +SAFEBLOCK = ImageFile.SAFEBLOCK + +def test_parser(): + + def roundtrip(format): + + im = lena("L").resize((1000, 1000)) + if format in ("MSP", "XBM"): + im = im.convert("1") + + file = BytesIO() + + im.save(file, format) + + data = file.getvalue() + + parser = ImageFile.Parser() + parser.feed(data) + imOut = parser.close() + + return im, imOut + + assert_image_equal(*roundtrip("BMP")) + assert_image_equal(*roundtrip("GIF")) + assert_image_equal(*roundtrip("IM")) + assert_image_equal(*roundtrip("MSP")) + try: + # force multiple blocks in PNG driver + ImageFile.MAXBLOCK = 8192 + assert_image_equal(*roundtrip("PNG")) + finally: + ImageFile.MAXBLOCK = MAXBLOCK + assert_image_equal(*roundtrip("PPM")) + assert_image_equal(*roundtrip("TIFF")) + assert_image_equal(*roundtrip("XBM")) + + im1, im2 = roundtrip("JPEG") # lossy compression + assert_image(im1, im2.mode, im2.size) + + assert_exception(IOError, lambda: roundtrip("PCX")) + assert_exception(IOError, lambda: roundtrip("PDF")) + + +def test_safeblock(): + + im1 = lena() + + try: + ImageFile.SAFEBLOCK = 1 + im2 = fromstring(tostring(im1, "PNG")) + finally: + ImageFile.SAFEBLOCK = SAFEBLOCK + + assert_image_equal(im1, im2) diff --git a/Tests/test_imagefileio.py b/Tests/test_imagefileio.py new file mode 100644 index 000000000..259c6fe1c --- /dev/null +++ b/Tests/test_imagefileio.py @@ -0,0 +1,24 @@ +from tester import * + +from PIL import Image +from PIL import ImageFileIO + +def test_fileio(): + + class DumbFile: + def __init__(self, data): + self.data = data + def read(self, bytes=None): + assert_equal(bytes, None) + return self.data + def close(self): + pass + + im1 = lena() + + io = ImageFileIO.ImageFileIO(DumbFile(tostring(im1, "PPM"))) + + im2 = Image.open(io) + assert_image_equal(im1, im2) + + diff --git a/Tests/test_imagefilter.py b/Tests/test_imagefilter.py new file mode 100644 index 000000000..214f88024 --- /dev/null +++ b/Tests/test_imagefilter.py @@ -0,0 +1,31 @@ +from tester import * + +from PIL import Image +from PIL import ImageFilter + +def test_sanity(): + # see test_image_filter for more tests + + assert_no_exception(lambda: ImageFilter.MaxFilter) + assert_no_exception(lambda: ImageFilter.MedianFilter) + assert_no_exception(lambda: ImageFilter.MinFilter) + assert_no_exception(lambda: ImageFilter.ModeFilter) + assert_no_exception(lambda: ImageFilter.Kernel((3, 3), list(range(9)))) + assert_no_exception(lambda: ImageFilter.GaussianBlur) + assert_no_exception(lambda: ImageFilter.GaussianBlur(5)) + assert_no_exception(lambda: ImageFilter.UnsharpMask) + assert_no_exception(lambda: ImageFilter.UnsharpMask(10)) + + assert_no_exception(lambda: ImageFilter.BLUR) + assert_no_exception(lambda: ImageFilter.CONTOUR) + assert_no_exception(lambda: ImageFilter.DETAIL) + assert_no_exception(lambda: ImageFilter.EDGE_ENHANCE) + assert_no_exception(lambda: ImageFilter.EDGE_ENHANCE_MORE) + assert_no_exception(lambda: ImageFilter.EMBOSS) + assert_no_exception(lambda: ImageFilter.FIND_EDGES) + assert_no_exception(lambda: ImageFilter.SMOOTH) + assert_no_exception(lambda: ImageFilter.SMOOTH_MORE) + assert_no_exception(lambda: ImageFilter.SHARPEN) + + + diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py new file mode 100644 index 000000000..3c4e1f1b8 --- /dev/null +++ b/Tests/test_imagefont.py @@ -0,0 +1,12 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageFont + ImageFont.core.getfont # check if freetype is available +except ImportError: + skip() + +def test_sanity(): + + assert_match(ImageFont.core.freetype2_version, "\d+\.\d+\.\d+$") diff --git a/Tests/test_imagegl.py b/Tests/test_imagegl.py new file mode 100644 index 000000000..87dd6aa2d --- /dev/null +++ b/Tests/test_imagegl.py @@ -0,0 +1,9 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageGL +except ImportError as v: + skip(v) + +success() diff --git a/Tests/test_imagegrab.py b/Tests/test_imagegrab.py new file mode 100644 index 000000000..67ff71960 --- /dev/null +++ b/Tests/test_imagegrab.py @@ -0,0 +1,13 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageGrab +except ImportError as v: + skip(v) + +def test_grab(): + im = ImageGrab.grab() + assert_image(im, im.mode, im.size) + + diff --git a/Tests/test_imagemath.py b/Tests/test_imagemath.py new file mode 100644 index 000000000..eaeb711ba --- /dev/null +++ b/Tests/test_imagemath.py @@ -0,0 +1,62 @@ +from tester import * + +from PIL import Image +from PIL import ImageMath + +def pixel(im): + if hasattr(im, "im"): + return "%s %r" % (im.mode, im.getpixel((0, 0))) + else: + if isinstance(im, type(0)): + return int(im) # hack to deal with booleans + print(im) + +A = Image.new("L", (1, 1), 1) +B = Image.new("L", (1, 1), 2) +F = Image.new("F", (1, 1), 3) +I = Image.new("I", (1, 1), 4) + +images = {"A": A, "B": B, "F": F, "I": I} + +def test_sanity(): + assert_equal(ImageMath.eval("1"), 1) + assert_equal(ImageMath.eval("1+A", A=2), 3) + assert_equal(pixel(ImageMath.eval("A+B", A=A, B=B)), "I 3") + assert_equal(pixel(ImageMath.eval("A+B", images)), "I 3") + assert_equal(pixel(ImageMath.eval("float(A)+B", images)), "F 3.0") + assert_equal(pixel(ImageMath.eval("int(float(A)+B)", images)), "I 3") + +def test_ops(): + + assert_equal(pixel(ImageMath.eval("-A", images)), "I -1") + assert_equal(pixel(ImageMath.eval("+B", images)), "L 2") + + assert_equal(pixel(ImageMath.eval("A+B", images)), "I 3") + assert_equal(pixel(ImageMath.eval("A-B", images)), "I -1") + assert_equal(pixel(ImageMath.eval("A*B", images)), "I 2") + assert_equal(pixel(ImageMath.eval("A/B", images)), "I 0") + assert_equal(pixel(ImageMath.eval("B**2", images)), "I 4") + assert_equal(pixel(ImageMath.eval("B**33", images)), "I 2147483647") + + assert_equal(pixel(ImageMath.eval("float(A)+B", images)), "F 3.0") + assert_equal(pixel(ImageMath.eval("float(A)-B", images)), "F -1.0") + assert_equal(pixel(ImageMath.eval("float(A)*B", images)), "F 2.0") + assert_equal(pixel(ImageMath.eval("float(A)/B", images)), "F 0.5") + assert_equal(pixel(ImageMath.eval("float(B)**2", images)), "F 4.0") + assert_equal(pixel(ImageMath.eval("float(B)**33", images)), "F 8589934592.0") + +def test_logical(): + assert_equal(pixel(ImageMath.eval("not A", images)), 0) + assert_equal(pixel(ImageMath.eval("A and B", images)), "L 2") + assert_equal(pixel(ImageMath.eval("A or B", images)), "L 1") + +def test_convert(): + assert_equal(pixel(ImageMath.eval("convert(A+B, 'L')", images)), "L 3") + assert_equal(pixel(ImageMath.eval("convert(A+B, '1')", images)), "1 0") + assert_equal(pixel(ImageMath.eval("convert(A+B, 'RGB')", images)), "RGB (3, 3, 3)") + +def test_compare(): + assert_equal(pixel(ImageMath.eval("min(A, B)", images)), "I 1") + assert_equal(pixel(ImageMath.eval("max(A, B)", images)), "I 2") + assert_equal(pixel(ImageMath.eval("A == 1", images)), "I 1") + assert_equal(pixel(ImageMath.eval("A == 2", images)), "I 0") diff --git a/Tests/test_imagemode.py b/Tests/test_imagemode.py new file mode 100644 index 000000000..54b04435f --- /dev/null +++ b/Tests/test_imagemode.py @@ -0,0 +1,23 @@ +from tester import * + +from PIL import Image +from PIL import ImageMode + +ImageMode.getmode("1") +ImageMode.getmode("L") +ImageMode.getmode("P") +ImageMode.getmode("RGB") +ImageMode.getmode("I") +ImageMode.getmode("F") + +m = ImageMode.getmode("1") +assert_equal(m.mode, "1") +assert_equal(m.bands, ("1",)) +assert_equal(m.basemode, "L") +assert_equal(m.basetype, "L") + +m = ImageMode.getmode("RGB") +assert_equal(m.mode, "RGB") +assert_equal(m.bands, ("R", "G", "B")) +assert_equal(m.basemode, "RGB") +assert_equal(m.basetype, "L") diff --git a/Tests/test_imageops.py b/Tests/test_imageops.py new file mode 100644 index 000000000..362937e81 --- /dev/null +++ b/Tests/test_imageops.py @@ -0,0 +1,70 @@ +from tester import * + +from PIL import Image +from PIL import ImageOps + +class Deformer: + def getmesh(self, im): + x, y = im.size + return [((0, 0, x, y), (0, 0, x, 0, x, y, y, 0))] + +deformer = Deformer() + +def test_sanity(): + + ImageOps.autocontrast(lena("L")) + ImageOps.autocontrast(lena("RGB")) + + ImageOps.autocontrast(lena("L"), cutoff=10) + ImageOps.autocontrast(lena("L"), ignore=[0, 255]) + + ImageOps.colorize(lena("L"), (0, 0, 0), (255, 255, 255)) + ImageOps.colorize(lena("L"), "black", "white") + + ImageOps.crop(lena("L"), 1) + ImageOps.crop(lena("RGB"), 1) + + ImageOps.deform(lena("L"), deformer) + ImageOps.deform(lena("RGB"), deformer) + + ImageOps.equalize(lena("L")) + ImageOps.equalize(lena("RGB")) + + ImageOps.expand(lena("L"), 1) + ImageOps.expand(lena("RGB"), 1) + ImageOps.expand(lena("L"), 2, "blue") + ImageOps.expand(lena("RGB"), 2, "blue") + + ImageOps.fit(lena("L"), (128, 128)) + ImageOps.fit(lena("RGB"), (128, 128)) + + ImageOps.flip(lena("L")) + ImageOps.flip(lena("RGB")) + + ImageOps.grayscale(lena("L")) + ImageOps.grayscale(lena("RGB")) + + ImageOps.invert(lena("L")) + ImageOps.invert(lena("RGB")) + + ImageOps.mirror(lena("L")) + ImageOps.mirror(lena("RGB")) + + ImageOps.posterize(lena("L"), 4) + ImageOps.posterize(lena("RGB"), 4) + + ImageOps.solarize(lena("L")) + ImageOps.solarize(lena("RGB")) + + success() + +def test_pil163(): + # Division by zero in equalize if < 255 pixels in image (@PIL163) + + i = lena("RGB").resize((15, 16)) + + ImageOps.equalize(i.convert("L")) + ImageOps.equalize(i.convert("P")) + ImageOps.equalize(i.convert("RGB")) + + success() diff --git a/Tests/test_imageops_usm.py b/Tests/test_imageops_usm.py new file mode 100644 index 000000000..83a93b8e0 --- /dev/null +++ b/Tests/test_imageops_usm.py @@ -0,0 +1,55 @@ +from tester import * + +from PIL import Image +from PIL import ImageOps +from PIL import ImageFilter + +im = Image.open("Images/lena.ppm") + +def test_ops_api(): + + i = ImageOps.gaussian_blur(im, 2.0) + assert_equal(i.mode, "RGB") + assert_equal(i.size, (128, 128)) + # i.save("blur.bmp") + + i = ImageOps.usm(im, 2.0, 125, 8) + assert_equal(i.mode, "RGB") + assert_equal(i.size, (128, 128)) + # i.save("usm.bmp") + +def test_filter_api(): + + filter = ImageFilter.GaussianBlur(2.0) + i = im.filter(filter) + assert_equal(i.mode, "RGB") + assert_equal(i.size, (128, 128)) + + filter = ImageFilter.UnsharpMask(2.0, 125, 8) + i = im.filter(filter) + assert_equal(i.mode, "RGB") + assert_equal(i.size, (128, 128)) + +def test_usm(): + + usm = ImageOps.unsharp_mask + assert_exception(ValueError, lambda: usm(im.convert("1"))) + assert_no_exception(lambda: usm(im.convert("L"))) + assert_exception(ValueError, lambda: usm(im.convert("I"))) + assert_exception(ValueError, lambda: usm(im.convert("F"))) + assert_no_exception(lambda: usm(im.convert("RGB"))) + assert_no_exception(lambda: usm(im.convert("RGBA"))) + assert_no_exception(lambda: usm(im.convert("CMYK"))) + assert_exception(ValueError, lambda: usm(im.convert("YCbCr"))) + +def test_blur(): + + blur = ImageOps.gaussian_blur + assert_exception(ValueError, lambda: blur(im.convert("1"))) + assert_no_exception(lambda: blur(im.convert("L"))) + assert_exception(ValueError, lambda: blur(im.convert("I"))) + assert_exception(ValueError, lambda: blur(im.convert("F"))) + assert_no_exception(lambda: blur(im.convert("RGB"))) + assert_no_exception(lambda: blur(im.convert("RGBA"))) + assert_no_exception(lambda: blur(im.convert("CMYK"))) + assert_exception(ValueError, lambda: blur(im.convert("YCbCr"))) diff --git a/Tests/test_imagepalette.py b/Tests/test_imagepalette.py new file mode 100644 index 000000000..573c706b1 --- /dev/null +++ b/Tests/test_imagepalette.py @@ -0,0 +1,44 @@ +from tester import * + +from PIL import Image +from PIL import ImagePalette + +ImagePalette = ImagePalette.ImagePalette + +def test_sanity(): + + assert_no_exception(lambda: ImagePalette("RGB", list(range(256))*3)) + assert_exception(ValueError, lambda: ImagePalette("RGB", list(range(256))*2)) + +def test_getcolor(): + + palette = ImagePalette() + + map = {} + for i in range(256): + map[palette.getcolor((i, i, i))] = i + + assert_equal(len(map), 256) + assert_exception(ValueError, lambda: palette.getcolor((1, 2, 3))) + +def test_file(): + + palette = ImagePalette() + + file = tempfile("temp.lut") + + palette.save(file) + + from PIL.ImagePalette import load, raw + + p = load(file) + + # load returns raw palette information + assert_equal(len(p[0]), 768) + assert_equal(p[1], "RGB") + + p = raw(p[1], p[0]) + assert_true(isinstance(p, ImagePalette)) + + + diff --git a/Tests/test_imagepath.py b/Tests/test_imagepath.py new file mode 100644 index 000000000..beadff10e --- /dev/null +++ b/Tests/test_imagepath.py @@ -0,0 +1,49 @@ +from tester import * + +from PIL import Image +from PIL import ImagePath + +import array + +def test_path(): + + p = ImagePath.Path(list(range(10))) + + # sequence interface + assert_equal(len(p), 5) + assert_equal(p[0], (0.0, 1.0)) + assert_equal(p[-1], (8.0, 9.0)) + assert_equal(list(p[:1]), [(0.0, 1.0)]) + assert_equal(list(p), [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)]) + + # method sanity check + assert_equal(p.tolist(), [(0.0, 1.0), (2.0, 3.0), (4.0, 5.0), (6.0, 7.0), (8.0, 9.0)]) + assert_equal(p.tolist(1), [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]) + + assert_equal(p.getbbox(), (0.0, 1.0, 8.0, 9.0)) + + assert_equal(p.compact(5), 2) + assert_equal(list(p), [(0.0, 1.0), (4.0, 5.0), (8.0, 9.0)]) + + p.transform((1,0,1,0,1,1)) + assert_equal(list(p), [(1.0, 2.0), (5.0, 6.0), (9.0, 10.0)]) + + # alternative constructors + p = ImagePath.Path([0, 1]) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path([0.0, 1.0]) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path([0, 1]) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path([(0, 1)]) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path(p) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path(p.tolist(0)) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path(p.tolist(1)) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path(array.array("f", [0, 1])) + assert_equal(list(p), [(0.0, 1.0)]) + p = ImagePath.Path(array.array("f", [0, 1]).tostring()) + assert_equal(list(p), [(0.0, 1.0)]) diff --git a/Tests/test_imageqt.py b/Tests/test_imageqt.py new file mode 100644 index 000000000..8d6ac9f3c --- /dev/null +++ b/Tests/test_imageqt.py @@ -0,0 +1,9 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageQt +except ImportError as v: + skip(v) + +success() diff --git a/Tests/test_imagesequence.py b/Tests/test_imagesequence.py new file mode 100644 index 000000000..0b244d88c --- /dev/null +++ b/Tests/test_imagesequence.py @@ -0,0 +1,22 @@ +from tester import * + +from PIL import Image +from PIL import ImageSequence + +def test_sanity(): + + file = tempfile("temp.im") + + im = lena("RGB") + im.save(file) + + seq = ImageSequence.Iterator(im) + + index = 0 + for frame in seq: + assert_image_equal(im, frame) + assert_equal(im.tell(), index) + index = index + 1 + + assert_equal(index, 1) + diff --git a/Tests/test_imageshow.py b/Tests/test_imageshow.py new file mode 100644 index 000000000..99ec005c8 --- /dev/null +++ b/Tests/test_imageshow.py @@ -0,0 +1,6 @@ +from tester import * + +from PIL import Image +from PIL import ImageShow + +success() diff --git a/Tests/test_imagestat.py b/Tests/test_imagestat.py new file mode 100644 index 000000000..02a461e22 --- /dev/null +++ b/Tests/test_imagestat.py @@ -0,0 +1,52 @@ +from tester import * + +from PIL import Image +from PIL import ImageStat + +def test_sanity(): + + im = lena() + + st = ImageStat.Stat(im) + st = ImageStat.Stat(im.histogram()) + st = ImageStat.Stat(im, Image.new("1", im.size, 1)) + + assert_no_exception(lambda: st.extrema) + assert_no_exception(lambda: st.sum) + assert_no_exception(lambda: st.mean) + assert_no_exception(lambda: st.median) + assert_no_exception(lambda: st.rms) + assert_no_exception(lambda: st.sum2) + assert_no_exception(lambda: st.var) + assert_no_exception(lambda: st.stddev) + assert_exception(AttributeError, lambda: st.spam) + + assert_exception(TypeError, lambda: ImageStat.Stat(1)) + +def test_lena(): + + im = lena() + + st = ImageStat.Stat(im) + + # verify a few values + assert_equal(st.extrema[0], (61, 255)) + assert_equal(st.median[0], 197) + assert_equal(st.sum[0], 2954416) + assert_equal(st.sum[1], 2027250) + assert_equal(st.sum[2], 1727331) + +def test_constant(): + + im = Image.new("L", (128, 128), 128) + + st = ImageStat.Stat(im) + + assert_equal(st.extrema[0], (128, 128)) + assert_equal(st.sum[0], 128**3) + assert_equal(st.sum2[0], 128**4) + assert_equal(st.mean[0], 128) + assert_equal(st.median[0], 128) + assert_equal(st.rms[0], 128) + assert_equal(st.var[0], 0) + assert_equal(st.stddev[0], 0) diff --git a/Tests/test_imagetk.py b/Tests/test_imagetk.py new file mode 100644 index 000000000..5c39c9283 --- /dev/null +++ b/Tests/test_imagetk.py @@ -0,0 +1,9 @@ +from tester import * + +from PIL import Image +try: + from PIL import ImageTk +except ImportError as v: + skip(v) + +success() diff --git a/Tests/test_imagetransform.py b/Tests/test_imagetransform.py new file mode 100644 index 000000000..884e6bb1c --- /dev/null +++ b/Tests/test_imagetransform.py @@ -0,0 +1,18 @@ +from tester import * + +from PIL import Image +from PIL import ImageTransform + +im = Image.new("L", (100, 100)) + +seq = tuple(range(10)) + +def test_sanity(): + transform = ImageTransform.AffineTransform(seq[:6]) + assert_no_exception(lambda: im.transform((100, 100), transform)) + transform = ImageTransform.ExtentTransform(seq[:4]) + assert_no_exception(lambda: im.transform((100, 100), transform)) + transform = ImageTransform.QuadTransform(seq[:8]) + assert_no_exception(lambda: im.transform((100, 100), transform)) + transform = ImageTransform.MeshTransform([(seq[:4], seq[:8])]) + assert_no_exception(lambda: im.transform((100, 100), transform)) diff --git a/Tests/test_imagewin.py b/Tests/test_imagewin.py new file mode 100644 index 000000000..268a75b6f --- /dev/null +++ b/Tests/test_imagewin.py @@ -0,0 +1,6 @@ +from tester import * + +from PIL import Image +from PIL import ImageWin + +success() diff --git a/Tests/test_lib_image.py b/Tests/test_lib_image.py new file mode 100644 index 000000000..93aa694d8 --- /dev/null +++ b/Tests/test_lib_image.py @@ -0,0 +1,30 @@ +from tester import * + +from PIL import Image + +def test_setmode(): + + im = Image.new("L", (1, 1), 255) + im.im.setmode("1") + assert_equal(im.im.getpixel((0, 0)), 255) + im.im.setmode("L") + assert_equal(im.im.getpixel((0, 0)), 255) + + im = Image.new("1", (1, 1), 1) + im.im.setmode("L") + assert_equal(im.im.getpixel((0, 0)), 255) + im.im.setmode("1") + assert_equal(im.im.getpixel((0, 0)), 255) + + im = Image.new("RGB", (1, 1), (1, 2, 3)) + im.im.setmode("RGB") + assert_equal(im.im.getpixel((0, 0)), (1, 2, 3)) + im.im.setmode("RGBA") + assert_equal(im.im.getpixel((0, 0)), (1, 2, 3, 255)) + im.im.setmode("RGBX") + assert_equal(im.im.getpixel((0, 0)), (1, 2, 3, 255)) + im.im.setmode("RGB") + assert_equal(im.im.getpixel((0, 0)), (1, 2, 3)) + + assert_exception(ValueError, lambda: im.im.setmode("L")) + assert_exception(ValueError, lambda: im.im.setmode("RGBABCDE")) diff --git a/Tests/test_lib_pack.py b/Tests/test_lib_pack.py new file mode 100644 index 000000000..cd26a54ea --- /dev/null +++ b/Tests/test_lib_pack.py @@ -0,0 +1,110 @@ +from tester import * + +from PIL import Image + +def pack(): + pass # not yet + +def test_pack(): + + def pack(mode, rawmode): + if len(mode) == 1: + im = Image.new(mode, (1, 1), 1) + else: + im = Image.new(mode, (1, 1), (1, 2, 3, 4)[:len(mode)]) + return list(im.tobytes("raw", rawmode)) + + assert_equal(pack("1", "1"), [128]) + assert_equal(pack("1", "1;I"), [0]) + assert_equal(pack("1", "1;R"), [1]) + assert_equal(pack("1", "1;IR"), [0]) + + assert_equal(pack("L", "L"), [1]) + + assert_equal(pack("I", "I"), [1, 0, 0, 0]) + + assert_equal(pack("F", "F"), [0, 0, 128, 63]) + + assert_equal(pack("LA", "LA"), [1, 2]) + + assert_equal(pack("RGB", "RGB"), [1, 2, 3]) + assert_equal(pack("RGB", "RGB;L"), [1, 2, 3]) + assert_equal(pack("RGB", "BGR"), [3, 2, 1]) + assert_equal(pack("RGB", "RGBX"), [1, 2, 3, 255]) # 255? + assert_equal(pack("RGB", "BGRX"), [3, 2, 1, 0]) + assert_equal(pack("RGB", "XRGB"), [0, 1, 2, 3]) + assert_equal(pack("RGB", "XBGR"), [0, 3, 2, 1]) + + assert_equal(pack("RGBX", "RGBX"), [1, 2, 3, 4]) # 4->255? + + assert_equal(pack("RGBA", "RGBA"), [1, 2, 3, 4]) + + assert_equal(pack("CMYK", "CMYK"), [1, 2, 3, 4]) + assert_equal(pack("YCbCr", "YCbCr"), [1, 2, 3]) + +def test_unpack(): + + def unpack(mode, rawmode, bytes_): + data = bytes(range(1,bytes_+1)) + im = Image.frombytes(mode, (1, 1), data, "raw", rawmode, 0, 1) + return im.getpixel((0, 0)) + + def unpack_1(mode, rawmode, value): + assert mode == "1" + im = Image.frombytes(mode, (8, 1), bytes([value]), "raw", rawmode, 0, 1) + return tuple(im.getdata()) + + X = 255 + + assert_equal(unpack_1("1", "1", 1), (0,0,0,0,0,0,0,X)) + assert_equal(unpack_1("1", "1;I", 1), (X,X,X,X,X,X,X,0)) + assert_equal(unpack_1("1", "1;R", 1), (X,0,0,0,0,0,0,0)) + assert_equal(unpack_1("1", "1;IR", 1), (0,X,X,X,X,X,X,X)) + + assert_equal(unpack_1("1", "1", 170), (X,0,X,0,X,0,X,0)) + assert_equal(unpack_1("1", "1;I", 170), (0,X,0,X,0,X,0,X)) + assert_equal(unpack_1("1", "1;R", 170), (0,X,0,X,0,X,0,X)) + assert_equal(unpack_1("1", "1;IR", 170), (X,0,X,0,X,0,X,0)) + + assert_equal(unpack("L", "L;2", 1), 0) + assert_equal(unpack("L", "L;4", 1), 0) + assert_equal(unpack("L", "L", 1), 1) + assert_equal(unpack("L", "L;I", 1), 254) + assert_equal(unpack("L", "L;R", 1), 128) + assert_equal(unpack("L", "L;16", 2), 2) # little endian + assert_equal(unpack("L", "L;16B", 2), 1) # big endian + + assert_equal(unpack("LA", "LA", 2), (1, 2)) + assert_equal(unpack("LA", "LA;L", 2), (1, 2)) + + assert_equal(unpack("RGB", "RGB", 3), (1, 2, 3)) + assert_equal(unpack("RGB", "RGB;L", 3), (1, 2, 3)) + assert_equal(unpack("RGB", "RGB;R", 3), (128, 64, 192)) + assert_equal(unpack("RGB", "RGB;16B", 6), (1, 3, 5)) # ? + assert_equal(unpack("RGB", "BGR", 3), (3, 2, 1)) + assert_equal(unpack("RGB", "BGR;15", 2), (0, 131, 8)) + assert_equal(unpack("RGB", "BGR;16", 2), (0, 64, 8)) + + assert_equal(unpack("RGB", "RGBX", 4), (1, 2, 3)) + assert_equal(unpack("RGB", "BGRX", 4), (3, 2, 1)) + assert_equal(unpack("RGB", "XRGB", 4), (2, 3, 4)) + assert_equal(unpack("RGB", "XBGR", 4), (4, 3, 2)) + + assert_equal(unpack("RGBA", "RGBA", 4), (1, 2, 3, 4)) + assert_equal(unpack("RGBA", "BGRA", 4), (3, 2, 1, 4)) + assert_equal(unpack("RGBA", "ARGB", 4), (2, 3, 4, 1)) + assert_equal(unpack("RGBA", "ABGR", 4), (4, 3, 2, 1)) + + assert_equal(unpack("RGBX", "RGBX", 4), (1, 2, 3, 4)) # 4->255? + assert_equal(unpack("RGBX", "BGRX", 4), (3, 2, 1, 255)) + assert_equal(unpack("RGBX", "XRGB", 4), (2, 3, 4, 255)) + assert_equal(unpack("RGBX", "XBGR", 4), (4, 3, 2, 255)) + + assert_equal(unpack("CMYK", "CMYK", 4), (1, 2, 3, 4)) + assert_equal(unpack("CMYK", "CMYK;I", 4), (254, 253, 252, 251)) + + assert_exception(ValueError, lambda: unpack("L", "L", 0)) + assert_exception(ValueError, lambda: unpack("RGB", "RGB", 2)) + assert_exception(ValueError, lambda: unpack("CMYK", "CMYK", 2)) + +run() diff --git a/Tests/test_mode_i16.py b/Tests/test_mode_i16.py new file mode 100644 index 000000000..91042e6f1 --- /dev/null +++ b/Tests/test_mode_i16.py @@ -0,0 +1,103 @@ +from tester import * + +from PIL import Image + +def verify(im1): + im2 = lena("I") + assert_equal(im1.size, im2.size) + pix1 = im1.load() + pix2 = im2.load() + for y in range(im1.size[1]): + for x in range(im1.size[0]): + xy = x, y + if pix1[xy] != pix2[xy]: + failure( + "got %r from mode %s at %s, expected %r" % + (pix1[xy], im1.mode, xy, pix2[xy]) + ) + return + success() + +def test_basic(): + # PIL 1.1 has limited support for 16-bit image data. Check that + # create/copy/transform and save works as expected. + + def basic(mode): + + imIn = lena("I").convert(mode) + verify(imIn) + + w, h = imIn.size + + imOut = imIn.copy() + verify(imOut) # copy + + imOut = imIn.transform((w, h), Image.EXTENT, (0, 0, w, h)) + verify(imOut) # transform + + filename = tempfile("temp.im") + imIn.save(filename) + + imOut = Image.open(filename) + + verify(imIn) + verify(imOut) + + imOut = imIn.crop((0, 0, w, h)) + verify(imOut) + + imOut = Image.new(mode, (w, h), None) + imOut.paste(imIn.crop((0, 0, w//2, h)), (0, 0)) + imOut.paste(imIn.crop((w//2, 0, w, h)), (w//2, 0)) + + verify(imIn) + verify(imOut) + + imIn = Image.new(mode, (1, 1), 1) + assert_equal(imIn.getpixel((0, 0)), 1) + + imIn.putpixel((0, 0), 2) + assert_equal(imIn.getpixel((0, 0)), 2) + + if mode == "L": + max = 255 + else: + max = 32767 + + imIn = Image.new(mode, (1, 1), 256) + assert_equal(imIn.getpixel((0, 0)), min(256, max)) + + imIn.putpixel((0, 0), 512) + assert_equal(imIn.getpixel((0, 0)), min(512, max)) + + basic("L") + + basic("I;16") + basic("I;16B") + basic("I;16L") + + basic("I") + + +def test_tostring(): + + def tostring(mode): + return Image.new(mode, (1, 1), 1).tobytes() + + assert_equal(tostring("L"), b"\x01") + assert_equal(tostring("I;16"), b"\x01\x00") + assert_equal(tostring("I;16B"), b"\x00\x01") + assert_equal(tostring("I"), b"\x01\x00\x00\x00") + + +def test_convert(): + + im = lena("I") + + verify(im.convert("I;16")) + verify(im.convert("I;16").convert("L")) + verify(im.convert("I;16").convert("I")) + + verify(im.convert("I;16B")) + verify(im.convert("I;16B").convert("L")) + verify(im.convert("I;16B").convert("I")) diff --git a/Tests/test_numpy.py b/Tests/test_numpy.py new file mode 100644 index 000000000..ea154afb8 --- /dev/null +++ b/Tests/test_numpy.py @@ -0,0 +1,54 @@ +from tester import * + +from PIL import Image + +try: + import site + import numpy +except ImportError: + skip() + +def test_numpy_to_image(): + + def to_image(dtype, bands=1, bool=0): + if bands == 1: + if bool: + data = [0, 1] * 50 + else: + data = list(range(100)) + a = numpy.array(data, dtype=dtype) + a.shape = 10, 10 + i = Image.fromarray(a) + if list(i.getdata()) != data: + print("data mismatch for", dtype) + else: + data = list(range(100)) + a = numpy.array([[x]*bands for x in data], dtype=dtype) + a.shape = 10, 10, bands + i = Image.fromarray(a) + if list(i.split()[0].getdata()) != list(range(100)): + print("data mismatch for", dtype) + # print dtype, list(i.getdata()) + return i + + # assert_image(to_image(numpy.bool, bool=1), "1", (10, 10)) + # assert_image(to_image(numpy.bool8, bool=1), "1", (10, 10)) + + assert_exception(TypeError, lambda: to_image(numpy.uint)) + assert_image(to_image(numpy.uint8), "L", (10, 10)) + assert_exception(TypeError, lambda: to_image(numpy.uint16)) + assert_exception(TypeError, lambda: to_image(numpy.uint32)) + assert_exception(TypeError, lambda: to_image(numpy.uint64)) + + assert_image(to_image(numpy.int), "I", (10, 10)) + assert_image(to_image(numpy.int8), "I", (10, 10)) + assert_image(to_image(numpy.int16), "I;16", (10, 10)) + assert_image(to_image(numpy.int32), "I", (10, 10)) + assert_exception(TypeError, lambda: to_image(numpy.int64)) + + assert_image(to_image(numpy.float), "F", (10, 10)) + assert_image(to_image(numpy.float32), "F", (10, 10)) + assert_image(to_image(numpy.float64), "F", (10, 10)) + + assert_image(to_image(numpy.uint8, 3), "RGB", (10, 10)) + assert_image(to_image(numpy.uint8, 4), "RGBA", (10, 10)) diff --git a/Tests/tester.py b/Tests/tester.py new file mode 100644 index 000000000..3e9d9e689 --- /dev/null +++ b/Tests/tester.py @@ -0,0 +1,229 @@ +# some test helpers + +_target = None +_tempfiles = [] +_logfile = None + +def success(): + import sys + success.count += 1 + if _logfile: + print(sys.argv[0], success.count, failure.count, file=_logfile) + +def failure(msg=None, frame=None): + import sys, linecache + failure.count += 1 + if _target: + if frame is None: + frame = sys._getframe() + while frame.f_globals.get("__name__") != _target.__name__: + frame = frame.f_back + location = (frame.f_code.co_filename, frame.f_lineno) + prefix = "%s:%d: " % location + line = linecache.getline(*location) + print(prefix + line.strip() + " failed:") + if msg: + print("- " + msg) + if _logfile: + print(sys.argv[0], success.count, failure.count, file=_logfile) + +success.count = failure.count = 0 + +# predicates + +def assert_true(v, msg=None): + if v: + success() + else: + failure(msg or "got %r, expected true value" % v) + +def assert_false(v, msg=None): + if v: + failure(msg or "got %r, expected false value" % v) + else: + success() + +def assert_equal(a, b, msg=None): + if a == b: + success() + else: + failure(msg or "got %r, expected %r" % (a, b)) + +def assert_match(v, pattern, msg=None): + import re + if re.match(pattern, v): + success() + else: + failure(msg or "got %r, doesn't match pattern %r" % (v, pattern)) + +def assert_exception(exc_class, func): + import sys, traceback + try: + func() + except exc_class: + success() + except: + failure("expected %r exception, got %r" % ( + exc_class.__name__, sys.exc_info()[0].__name__)) + traceback.print_exc() + else: + failure("expected %r exception, got no exception" % exc_class.__name__) + +def assert_no_exception(func): + import sys, traceback + try: + func() + except: + failure("expected no exception, got %r" % sys.exc_info()[0].__name__) + traceback.print_exc() + else: + success() + +def assert_warning(warn_class, func): + # note: this assert calls func three times! + import warnings + def warn_error(message, category, **options): + raise category(message) + def warn_ignore(message, category, **options): + pass + warn = warnings.warn + result = None + try: + warnings.warn = warn_ignore + assert_no_exception(func) + result = func() + warnings.warn = warn_error + assert_exception(warn_class, func) + finally: + warnings.warn = warn # restore + return result + +# helpers + +from io import BytesIO + +def fromstring(data): + from PIL import Image + return Image.open(BytesIO(data)) + +def tostring(im, format, **options): + out = BytesIO() + im.save(out, format, **options) + return out.getvalue() + +def lena(mode="RGB", cache={}): + from PIL import Image + im = cache.get(mode) + if im is None: + if mode == "RGB": + im = Image.open("Images/lena.ppm") + elif mode == "F": + im = lena("L").convert(mode) + elif mode[:4] == "I;16": + im = lena("I").convert(mode) + else: + im = lena("RGB").convert(mode) + cache[mode] = im + return im + +def assert_image(im, mode, size, msg=None): + if mode is not None and im.mode != mode: + failure(msg or "got mode %r, expected %r" % (im.mode, mode)) + elif size is not None and im.size != size: + failure(msg or "got size %r, expected %r" % (im.size, size)) + else: + success() + +def assert_image_equal(a, b, msg=None): + if a.mode != b.mode: + failure(msg or "got mode %r, expected %r" % (a.mode, b.mode)) + elif a.size != b.size: + failure(msg or "got size %r, expected %r" % (a.size, b.size)) + elif a.tobytes() != b.tobytes(): + failure(msg or "got different content") + # generate better diff? + else: + success() + +def tempfile(template, *extra): + import os, sys + files = [] + for temp in (template,) + extra: + assert temp[:5] in ("temp.", "temp_") + root, name = os.path.split(sys.argv[0]) + name = temp[:4] + os.path.splitext(name)[0][4:] + name = name + "_%d" % len(_tempfiles) + temp[4:] + name = os.path.join(root, name) + files.append(name) + _tempfiles.extend(files) + return files[0] + +# test runner + +def run(): + global _target, _tests, run + import sys, traceback + _target = sys.modules["__main__"] + run = None # no need to run twice + tests = [] + for name, value in list(vars(_target).items()): + if name[:5] == "test_" and type(value) is type(success): + tests.append((value.__code__.co_firstlineno, name, value)) + tests.sort() # sort by line + for lineno, name, func in tests: + try: + _tests = [] + func() + for func, args in _tests: + func(*args) + except: + t, v, tb = sys.exc_info() + tb = tb.tb_next + if tb: + failure(frame=tb.tb_frame) + traceback.print_exception(t, v, tb) + else: + print("%s:%d: cannot call test function: %s" % ( + sys.argv[0], lineno, v)) + failure.count += 1 + +def yield_test(function, *args): + # collect delayed/generated tests + _tests.append((function, args)) + +def skip(msg=None): + import os + print("skip") + os._exit(0) # don't run exit handlers + +def _setup(): + global _logfile + def report(): + if run: + run() + if success.count and not failure.count: + print("ok") + # only clean out tempfiles if test passed + import os + for file in _tempfiles: + try: + os.remove(file) + except OSError: + pass # report? + if "--coverage" in sys.argv: + import coverage + coverage.stop() + # The coverage module messes up when used from inside an + # atexit handler. Do an explicit save to make sure that + # we actually flush the coverage cache. + coverage.the_coverage.save() + import atexit, sys + atexit.register(report) + if "--coverage" in sys.argv: + import coverage + coverage.start() + if "--log" in sys.argv: + _logfile = open("test.log", "a") + + +_setup() diff --git a/Tests/threaded_save.py b/Tests/threaded_save.py new file mode 100644 index 000000000..8162e713c --- /dev/null +++ b/Tests/threaded_save.py @@ -0,0 +1,56 @@ +from PIL import Image + +import sys, time +import io +import threading, queue + +try: + format = sys.argv[1] +except: + format = "PNG" + +im = Image.open("Images/lena.ppm") +im.load() + +queue = queue.Queue() + +result = [] + +class Worker(threading.Thread): + def run(self): + while 1: + im = queue.get() + if im is None: + queue.task_done() + sys.stdout.write("x") + break + f = io.BytesIO() + im.save(f, format, optimize=1) + data = f.getvalue() + result.append(len(data)) + im = Image.open(io.BytesIO(data)) + im.load() + sys.stdout.write(".") + queue.task_done() + +t0 = time.time() + +threads = 20 +jobs = 100 + +for i in range(threads): + w = Worker() + w.start() + +for i in range(jobs): + queue.put(im) + +for i in range(threads): + queue.put(None) + +queue.join() + +print() +print(time.time() - t0) +print(len(result), sum(result)) +print(result) diff --git a/Tests/versions.py b/Tests/versions.py new file mode 100644 index 000000000..a4e4a0bc2 --- /dev/null +++ b/Tests/versions.py @@ -0,0 +1,23 @@ +from PIL import Image + +def version(module, version): + v = getattr(module.core, version + "_version", None) + if v: + print(version, v) + +version(Image, "jpeglib") +version(Image, "zlib") + +try: + from PIL import ImageFont +except ImportError: + pass +else: + version(ImageFont, "freetype2") + +try: + from PIL import ImageCms +except ImportError: + pass +else: + version(ImageCms, "littlecms")