Exemple #1
0
    def test_ppm(self):
        if pyvips.type_find("VipsForeign", "ppmload") == 0:
            print("no PPM support, skipping test")
            return

        self.save_load("%s.ppm", self.mono)
        self.save_load("%s.ppm", self.colour)
Exemple #2
0
    def test_pdfload(self):
        if pyvips.type_find("VipsForeign", "pdfload") == 0 or \
                not os.path.isfile(PDF_FILE):
            print("no pdf support, skipping test")
            return

        def pdf_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [35, 31, 32, 255])
            self.assertEqual(im.width, 1133)
            self.assertEqual(im.height, 680)
            self.assertEqual(im.bands, 4)

        self.file_loader("pdfload", PDF_FILE, pdf_valid)
        self.buffer_loader("pdfload_buffer", PDF_FILE, pdf_valid)

        im = pyvips.Image.new_from_file(PDF_FILE)
        x = pyvips.Image.new_from_file(PDF_FILE, scale=2)
        self.assertLess(abs(im.width * 2 - x.width), 2)
        self.assertLess(abs(im.height * 2 - x.height), 2)

        im = pyvips.Image.new_from_file(PDF_FILE)
        x = pyvips.Image.new_from_file(PDF_FILE, dpi=144)
        self.assertLess(abs(im.width * 2 - x.width), 2)
        self.assertLess(abs(im.height * 2 - x.height), 2)
Exemple #3
0
    def test_gifload(self):
        if pyvips.type_find("VipsForeign", "gifload") == 0 or \
                not os.path.isfile(GIF_FILE):
            print("no gif support, skipping test")
            return

        def gif_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [33])
            self.assertEqual(im.width, 159)
            self.assertEqual(im.height, 203)
            self.assertEqual(im.bands, 1)

        self.file_loader("gifload", GIF_FILE, gif_valid)
        self.buffer_loader("gifload_buffer", GIF_FILE, gif_valid)

        # 'n' param added in 8.5
        if pyvips.at_least_libvips(8, 5):
            x1 = pyvips.Image.new_from_file(GIF_ANIM_FILE)
            x2 = pyvips.Image.new_from_file(GIF_ANIM_FILE, n=2)
            self.assertEqual(x2.height, 2 * x1.height)
            page_height = x2.get_value("page-height")
            self.assertEqual(page_height, x1.height)

            x2 = pyvips.Image.new_from_file(GIF_ANIM_FILE, n=-1)
            self.assertEqual(x2.height, 5 * x1.height)

            x2 = pyvips.Image.new_from_file(GIF_ANIM_FILE, page=1, n=-1)
            self.assertEqual(x2.height, 4 * x1.height)
Exemple #4
0
    def test_smartcrop(self):
        if pyvips.type_find("VipsOperation", "smartcrop") == 0:
            print("no smartcrop, skipping test")
            return

        test = self.image.smartcrop(100, 100)
        self.assertEqual(test.width, 100)
        self.assertEqual(test.height, 100)
Exemple #5
0
    def test_rad(self):
        if pyvips.type_find("VipsForeign", "radload") == 0:
            print("no Radiance support, skipping test")
            return

        self.save_load("%s.hdr", self.colour)
        self.save_buffer_tempfile("radsave_buffer", ".hdr",
                                  self.rad, max_diff=0)
Exemple #6
0
    def test_magickload(self):
        if pyvips.type_find("VipsForeign", "magickload") == 0 or \
                not os.path.isfile(GIF_FILE):
            print("no magick support, skipping test")
            return

        def gif_valid(self, im):
            # some libMagick produce an RGB for this image, some a mono, some
            # rgba, some have a valid alpha, some don't :-(
            # therefore ... just test channel 0
            a = im(10, 10)[0]

            self.assertAlmostEqual(a, 33)
            self.assertEqual(im.width, 159)
            self.assertEqual(im.height, 203)

        self.file_loader("magickload", GIF_FILE, gif_valid)
        self.buffer_loader("magickload_buffer", GIF_FILE, gif_valid)

        # we should have rgba for svg files
        im = pyvips.Image.magickload(SVG_FILE)
        self.assertEqual(im.bands, 4)

        # density should change size of generated svg
        im = pyvips.Image.magickload(SVG_FILE, density='100')
        width = im.width
        height = im.height
        im = pyvips.Image.magickload(SVG_FILE, density='200')
        # This seems to fail on travis, no idea why, some problem in their IM
        # perhaps
        # self.assertEqual(im.width, width * 2)
        # self.assertEqual(im.height, height * 2)

        # all-frames should load every frame of the animation
        # (though all-frames is deprecated)
        im = pyvips.Image.magickload(GIF_ANIM_FILE)
        width = im.width
        height = im.height
        im = pyvips.Image.magickload(GIF_ANIM_FILE, all_frames=True)
        self.assertEqual(im.width, width)
        self.assertEqual(im.height, height * 5)

        # page/n let you pick a range of pages
        # 'n' param added in 8.5
        if pyvips.at_least_libvips(8, 5):
            im = pyvips.Image.magickload(GIF_ANIM_FILE)
            width = im.width
            height = im.height
            im = pyvips.Image.magickload(GIF_ANIM_FILE, page=1, n=2)
            self.assertEqual(im.width, width)
            self.assertEqual(im.height, height * 2)
            page_height = im.get_value("page-height")
            self.assertEqual(page_height, height)

        # should work for dicom
        im = pyvips.Image.magickload(DICOM_FILE)
        self.assertEqual(im.width, 128)
        self.assertEqual(im.height, 128)
Exemple #7
0
 def test_text(self):
     if pyvips.type_find("VipsOperation", "text") != 0:
         im = pyvips.Image.text("Hello, world!")
         self.assertTrue(im.width > 10)
         self.assertTrue(im.height > 10)
         self.assertEqual(im.bands, 1)
         self.assertEqual(im.format, pyvips.BandFormat.UCHAR)
         self.assertEqual(im.max(), 255)
         self.assertEqual(im.min(), 0)
Exemple #8
0
    def test_jpeg(self):
        if pyvips.type_find("VipsForeign", "jpegload") == 0:
            print("no jpeg support in this vips, skipping test")
            return

        def jpeg_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [6, 5, 3])
            profile = im.get_value("icc-profile-data")
            self.assertEqual(len(profile), 1352)
            self.assertEqual(im.width, 1024)
            self.assertEqual(im.height, 768)
            self.assertEqual(im.bands, 3)

        self.file_loader("jpegload", JPEG_FILE, jpeg_valid)
        self.save_load("%s.jpg", self.mono)
        self.save_load("%s.jpg", self.colour)

        self.buffer_loader("jpegload_buffer", JPEG_FILE, jpeg_valid)
        self.save_load_buffer("jpegsave_buffer", "jpegload_buffer",
                              self.colour, 80)

        # see if we have exif parsing: our test image has this field
        x = pyvips.Image.new_from_file(JPEG_FILE)
        if x.get_typeof("exif-ifd0-Orientation") != 0:
            # we need a copy of the image to set the new metadata on
            # otherwise we get caching problems

            # can set, save and load new orientation
            x = pyvips.Image.new_from_file(JPEG_FILE)
            x = x.copy()
            x.set_value("orientation", 2)
            filename = temp_filename(self.tempdir, '.jpg')
            x.write_to_file(filename)
            x = pyvips.Image.new_from_file(filename)
            y = x.get_value("orientation")
            self.assertEqual(y, 2)

            # can remove orientation, save, load again, orientation
            # has reset
            x.remove("orientation")
            filename = temp_filename(self.tempdir, '.jpg')
            x.write_to_file(filename)
            x = pyvips.Image.new_from_file(filename)
            y = x.get_value("orientation")
            self.assertEqual(y, 1)

            # autorotate load works
            filename = temp_filename(self.tempdir, '.jpg')
            x = pyvips.Image.new_from_file(JPEG_FILE)
            x = x.copy()
            x.set_value("orientation", 6)
            x.write_to_file(filename)
            x1 = pyvips.Image.new_from_file(filename)
            x2 = pyvips.Image.new_from_file(filename, autorotate=True)
            self.assertEqual(x1.width, x2.height)
            self.assertEqual(x1.height, x2.width)
Exemple #9
0
    def test_perlin(self):
        if pyvips.type_find("VipsOperation", "perlin") == 0:
            print("no perlin, skipping test")
            return

        im = pyvips.Image.perlin(512, 512)
        self.assertEqual(im.width, 512)
        self.assertEqual(im.height, 512)
        self.assertEqual(im.bands, 1)
        self.assertEqual(im.format, pyvips.BandFormat.FLOAT)
Exemple #10
0
    def test_webp(self):
        if pyvips.type_find("VipsForeign", "webpload") == 0 or \
                not os.path.isfile(WEBP_FILE):
            print("no webp support, skipping test")
            return

        def webp_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [71, 166, 236])
            self.assertEqual(im.width, 550)
            self.assertEqual(im.height, 368)
            self.assertEqual(im.bands, 3)

        self.file_loader("webpload", WEBP_FILE, webp_valid)
        self.buffer_loader("webpload_buffer", WEBP_FILE, webp_valid)
        self.save_load_buffer("webpsave_buffer", "webpload_buffer",
                              self.colour, 60)
        self.save_load("%s.webp", self.colour)

        # test lossless mode
        im = pyvips.Image.new_from_file(WEBP_FILE)
        buf = im.webpsave_buffer(lossless=True)
        im2 = pyvips.Image.new_from_buffer(buf, "")
        self.assertEqual(im.avg(), im2.avg())

        # higher Q should mean a bigger buffer
        b1 = im.webpsave_buffer(Q=10)
        b2 = im.webpsave_buffer(Q=90)
        self.assertGreater(len(b2), len(b1))

        # try saving an image with an ICC profile and reading it back ... if we
        # can do it, our webp supports metadata load/save
        buf = self.colour.webpsave_buffer()
        im = pyvips.Image.new_from_buffer(buf, "")
        if im.get_typeof("icc-profile-data") != 0:
            # verify that the profile comes back unharmed
            p1 = self.colour.get_value("icc-profile-data")
            p2 = im.get_value("icc-profile-data")
            self.assertEqual(p1, p2)

            # add tests for exif, xmp, ipct
            # the exif test will need us to be able to walk the header,
            # we can't just check exif-data

            # we can test that exif changes change the output of webpsave
            # first make sure we have exif support
            z = pyvips.Image.new_from_file(JPEG_FILE)
            if z.get_typeof("exif-ifd0-Orientation") != 0:
                x = self.colour.copy()
                x.set_value("orientation", 6)
                buf = x.webpsave_buffer()
                y = pyvips.Image.new_from_buffer(buf, "")
                self.assertEqual(y.get_value("orientation"), 6)
Exemple #11
0
    def test_composite(self):
        if pyvips.type_find("VipsConversion", "composite") == 0:
            print("no composite support, skipping test")
            return

        # 50% transparent image
        overlay = self.colour.bandjoin(128)
        base = self.colour + 100
        comp = base.composite(overlay, "over")

        self.assertAlmostEqualObjects(comp(0, 0), [51.8, 52.8, 53.8, 255],
                                      places=1)
Exemple #12
0
    def test_openslideload(self):
        if pyvips.type_find("VipsForeign", "openslideload") == 0 or \
                not os.path.isfile(OPENSLIDE_FILE):
            print("no openslide support, skipping test")
            return

        def openslide_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [244, 250, 243, 255])
            self.assertEqual(im.width, 2220)
            self.assertEqual(im.height, 2967)
            self.assertEqual(im.bands, 4)

        self.file_loader("openslideload", OPENSLIDE_FILE, openslide_valid)
Exemple #13
0
    def test_matload(self):
        if pyvips.type_find("VipsForeign", "matload") == 0 or \
                not os.path.isfile(MATLAB_FILE):
            print("no matlab support, skipping test")
            return

        def matlab_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [38671.0, 33914.0, 26762.0])
            self.assertEqual(im.width, 290)
            self.assertEqual(im.height, 442)
            self.assertEqual(im.bands, 3)

        self.file_loader("matload", MATLAB_FILE, matlab_valid)
Exemple #14
0
    def test_analyzeload(self):
        if pyvips.type_find("VipsForeign", "analyzeload") == 0 or \
                not os.path.isfile(ANALYZE_FILE):
            print("no analyze support, skipping test")
            return

        def analyze_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqual(a[0], 3335)
            self.assertEqual(im.width, 128)
            self.assertEqual(im.height, 8064)
            self.assertEqual(im.bands, 1)

        self.file_loader("analyzeload", ANALYZE_FILE, analyze_valid)
Exemple #15
0
    def test_openexrload(self):
        if pyvips.type_find("VipsForeign", "openexrload") == 0 or \
                not os.path.isfile(EXR_FILE):
            print("no openexr support, skipping test")
            return

        def exr_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [0.124512, 0.159668,
                                              0.040375, 1.0],
                                          places=5)
            self.assertEqual(im.width, 610)
            self.assertEqual(im.height, 406)
            self.assertEqual(im.bands, 4)

        self.file_loader("openexrload", EXR_FILE, exr_valid)
Exemple #16
0
    def test_gravity(self):
        if pyvips.type_find("VipsOperation", "gravity") == 0:
            print("no gravity in this vips, skipping test")
            return

        im = pyvips.Image.black(1, 1) + 255

        positions = [['centre', 1, 1], ['north', 1, 0], ['south', 1, 2],
                     ['east', 2, 1], ['west', 0, 1], ['north-east', 2, 0],
                     ['south-east', 2, 2], ['south-west', 0, 2],
                     ['north-west', 0, 0]]

        for direction, x, y in positions:
            im2 = im.gravity(direction, 3, 3)
            self.assertAlmostEqualObjects(im2(x, y), [255])
            self.assertAlmostEqualObjects(im2.avg(), 255.0 / 9.0)
Exemple #17
0
    def test_fitsload(self):
        if pyvips.type_find("VipsForeign", "fitsload") == 0 or \
                not os.path.isfile(FITS_FILE):
            print("no fits support, skipping test")
            return

        def fits_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(
                a, [-0.165013, -0.148553, 1.09122, -0.942242], places=5)
            self.assertEqual(im.width, 200)
            self.assertEqual(im.height, 200)
            self.assertEqual(im.bands, 4)

        self.file_loader("fitsload", FITS_FILE, fits_valid)
        self.save_load("%s.fits", self.mono)
Exemple #18
0
    def test_png(self):
        if pyvips.type_find("VipsForeign", "pngload") == 0 or \
                not os.path.isfile(PNG_FILE):
            print("no png support, skipping test")
            return

        def png_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [38671.0, 33914.0, 26762.0])
            self.assertEqual(im.width, 290)
            self.assertEqual(im.height, 442)
            self.assertEqual(im.bands, 3)

        self.file_loader("pngload", PNG_FILE, png_valid)
        self.buffer_loader("pngload_buffer", PNG_FILE, png_valid)
        self.save_load_buffer("pngsave_buffer", "pngload_buffer", self.colour)
        self.save_load("%s.png", self.mono)
        self.save_load("%s.png", self.colour)
Exemple #19
0
    def test_find_trim(self):
        if pyvips.type_find("VipsOperation", "find_trim") != 0:
            im = pyvips.Image.black(50, 60) + 100
            test = im.embed(10, 20, 200, 300, extend="white")

            for x in unsigned_formats + float_formats:
                a = test.cast(x)
                left, top, width, height = a.find_trim()

                assert left == 10
                assert top == 20
                assert width == 50
                assert height == 60

            test_rgb = test.bandjoin([test, test])
            left, top, width, height = test_rgb.find_trim(background=[255, 255,
                                                                      255])
            assert left == 10
            assert top == 20
            assert width == 50
            assert height == 60
Exemple #20
0
    def test_svgload(self):
        if pyvips.type_find("VipsForeign", "svgload") == 0 or \
                not os.path.isfile(SVG_FILE):
            print("no svg support, skipping test")
            return

        def svg_valid(self, im):
            a = im(10, 10)

            # some old rsvg versions are way, way off
            self.assertLess(abs(a[0] - 79), 2)
            self.assertLess(abs(a[1] - 79), 2)
            self.assertLess(abs(a[2] - 132), 2)
            self.assertLess(abs(a[3] - 255), 2)

            self.assertEqual(im.width, 288)
            self.assertEqual(im.height, 470)
            self.assertEqual(im.bands, 4)

        self.file_loader("svgload", SVG_FILE, svg_valid)
        self.buffer_loader("svgload_buffer", SVG_FILE, svg_valid)

        self.file_loader("svgload", SVGZ_FILE, svg_valid)
        self.buffer_loader("svgload_buffer", SVGZ_FILE, svg_valid)

        self.file_loader("svgload", SVG_GZ_FILE, svg_valid)

        im = pyvips.Image.new_from_file(SVG_FILE)
        x = pyvips.Image.new_from_file(SVG_FILE, scale=2)
        self.assertLess(abs(im.width * 2 - x.width), 2)
        self.assertLess(abs(im.height * 2 - x.height), 2)

        im = pyvips.Image.new_from_file(SVG_FILE)
        x = pyvips.Image.new_from_file(SVG_FILE, dpi=144)
        self.assertLess(abs(im.width * 2 - x.width), 2)
        self.assertLess(abs(im.height * 2 - x.height), 2)
Exemple #21
0
def have(name):
    return pyvips.type_find("VipsOperation", name) != 0
Exemple #22
0
    def test_tiff(self):
        if pyvips.type_find("VipsForeign", "tiffload") == 0 or \
                not os.path.isfile(TIF_FILE):
            print("no tiff support, skipping test")
            return

        def tiff_valid(self, im):
            a = im(10, 10)
            self.assertAlmostEqualObjects(a, [38671.0, 33914.0, 26762.0])
            self.assertEqual(im.width, 290)
            self.assertEqual(im.height, 442)
            self.assertEqual(im.bands, 3)

        self.file_loader("tiffload", TIF_FILE, tiff_valid)
        self.buffer_loader("tiffload_buffer", TIF_FILE, tiff_valid)
        if pyvips.at_least_libvips(8, 5):
            self.save_load_buffer("tiffsave_buffer",
                                  "tiffload_buffer",
                                  self.colour)
        self.save_load("%s.tif", self.mono)
        self.save_load("%s.tif", self.colour)
        self.save_load("%s.tif", self.cmyk)

        self.save_load("%s.tif", self.onebit)
        self.save_load_file(".tif", "[squash]", self.onebit, 0)
        self.save_load_file(".tif", "[miniswhite]", self.onebit, 0)
        self.save_load_file(".tif", "[squash,miniswhite]", self.onebit, 0)

        self.save_load_file(".tif",
                            "[profile={0}]".format(SRGB_FILE),
                            self.colour, 0)
        self.save_load_file(".tif", "[tile]", self.colour, 0)
        self.save_load_file(".tif", "[tile,pyramid]", self.colour, 0)
        self.save_load_file(".tif",
                            "[tile,pyramid,compression=jpeg]", self.colour, 80)
        self.save_load_file(".tif", "[bigtiff]", self.colour, 0)
        self.save_load_file(".tif", "[compression=jpeg]", self.colour, 80)
        self.save_load_file(".tif",
                            "[tile,tile-width=256]", self.colour, 10)

        filename = temp_filename(self.tempdir, '.tif')
        x = pyvips.Image.new_from_file(TIF_FILE)
        x = x.copy()
        x.set_value("orientation", 2)
        x.write_to_file(filename)
        x = pyvips.Image.new_from_file(filename)
        y = x.get_value("orientation")
        self.assertEqual(y, 2)

        filename = temp_filename(self.tempdir, '.tif')
        x = pyvips.Image.new_from_file(TIF_FILE)
        x = x.copy()
        x.set_value("orientation", 2)
        x.write_to_file(filename)
        x = pyvips.Image.new_from_file(filename)
        y = x.get_value("orientation")
        self.assertEqual(y, 2)
        x.remove("orientation")

        filename = temp_filename(self.tempdir, '.tif')
        x.write_to_file(filename)
        x = pyvips.Image.new_from_file(filename)
        y = x.get_value("orientation")
        self.assertEqual(y, 1)

        filename = temp_filename(self.tempdir, '.tif')
        x = pyvips.Image.new_from_file(TIF_FILE)
        x = x.copy()
        x.set_value("orientation", 6)
        x.write_to_file(filename)
        x1 = pyvips.Image.new_from_file(filename)
        x2 = pyvips.Image.new_from_file(filename, autorotate=True)
        self.assertEqual(x1.width, x2.height)
        self.assertEqual(x1.height, x2.width)

        # OME support in 8.5
        if pyvips.at_least_libvips(8, 5):
            x = pyvips.Image.new_from_file(OME_FILE)
            self.assertEqual(x.width, 439)
            self.assertEqual(x.height, 167)
            page_height = x.height

            x = pyvips.Image.new_from_file(OME_FILE, n=-1)
            self.assertEqual(x.width, 439)
            self.assertEqual(x.height, page_height * 15)

            x = pyvips.Image.new_from_file(OME_FILE, page=1, n=-1)
            self.assertEqual(x.width, 439)
            self.assertEqual(x.height, page_height * 14)

            x = pyvips.Image.new_from_file(OME_FILE, page=1, n=2)
            self.assertEqual(x.width, 439)
            self.assertEqual(x.height, page_height * 2)

            x = pyvips.Image.new_from_file(OME_FILE, n=-1)
            self.assertEqual(x(0, 166)[0], 96)
            self.assertEqual(x(0, 167)[0], 0)
            self.assertEqual(x(0, 168)[0], 1)

            filename = temp_filename(self.tempdir, '.tif')
            x.write_to_file(filename)

            x = pyvips.Image.new_from_file(filename, n=-1)
            self.assertEqual(x.width, 439)
            self.assertEqual(x.height, page_height * 15)
            self.assertEqual(x(0, 166)[0], 96)
            self.assertEqual(x(0, 167)[0], 0)
            self.assertEqual(x(0, 168)[0], 1)

        # pyr save to buffer added in 8.6
        if pyvips.at_least_libvips(8, 6):
            x = pyvips.Image.new_from_file(TIF_FILE)
            buf = x.tiffsave_buffer(tile=True, pyramid=True)
            filename = temp_filename(self.tempdir, '.tif')
            x.tiffsave(filename, tile=True, pyramid=True)
            with open(filename, 'rb') as f:
                buf2 = f.read()
            self.assertEqual(len(buf), len(buf2))

            a = pyvips.Image.new_from_buffer(buf, "", page=2)
            b = pyvips.Image.new_from_buffer(buf2, "", page=2)
            self.assertEqual(a.width, b.width)
            self.assertEqual(a.height, b.height)
            self.assertEqual(a.avg(), b.avg())