diff --git a/test/test-suite/helpers/helpers.py b/test/test-suite/helpers/helpers.py index c2051724..09cc3b47 100644 --- a/test/test-suite/helpers/helpers.py +++ b/test/test-suite/helpers/helpers.py @@ -29,6 +29,7 @@ DICOM_FILE = os.path.join(IMAGES, "dicom_test_image.dcm") BMP_FILE = os.path.join(IMAGES, "MARBLES.BMP") NIFTI_FILE = os.path.join(IMAGES, "avg152T1_LR_nifti.nii.gz") ICO_FILE = os.path.join(IMAGES, "favicon.ico") +HEIC_FILE = os.path.join(IMAGES, "Example1.heic") unsigned_formats = [pyvips.BandFormat.UCHAR, pyvips.BandFormat.USHORT, diff --git a/test/test-suite/images/Example1.heic b/test/test-suite/images/Example1.heic new file mode 100644 index 00000000..dfa3d5f0 Binary files /dev/null and b/test/test-suite/images/Example1.heic differ diff --git a/test/test-suite/test_foreign.py b/test/test-suite/test_foreign.py index b92940c9..9be1a6ad 100644 --- a/test/test-suite/test_foreign.py +++ b/test/test-suite/test_foreign.py @@ -10,7 +10,7 @@ from helpers import \ JPEG_FILE, SRGB_FILE, MATLAB_FILE, PNG_FILE, TIF_FILE, OME_FILE, \ ANALYZE_FILE, GIF_FILE, WEBP_FILE, EXR_FILE, FITS_FILE, OPENSLIDE_FILE, \ PDF_FILE, SVG_FILE, SVGZ_FILE, SVG_GZ_FILE, GIF_ANIM_FILE, DICOM_FILE, \ - BMP_FILE, NIFTI_FILE, ICO_FILE, \ + BMP_FILE, NIFTI_FILE, ICO_FILE, HEIC_FILE, \ temp_filename, assert_almost_equal_objects, have, skip_if_no @@ -561,13 +561,6 @@ class TestForeign: assert im.height == 9919 assert im.bands == 1 - print("NIFTI_FILE =", NIFTI_FILE) - im = pyvips.Operation.call("niftiload", NIFTI_FILE) - print("width = ", im.width) - - im = pyvips.Operation.call("niftiload", "test/images/avg152T1_LR_nifti.nii.gz") - print("width = ", im.width) - self.file_loader("niftiload", NIFTI_FILE, nifti_valid) self.save_load("%s.nii.gz", self.mono) @@ -822,5 +815,53 @@ class TestForeign: buf = self.colour.dzsave_buffer(region_shrink="mode") buf = self.colour.dzsave_buffer(region_shrink="median") + @skip_if_no("heifload") + def test_heifload(self): + def heif_valid(im): + a = im(10, 10) + assert_almost_equal_objects(a, [75.0, 86.0, 81.0]) + assert im.width == 4032 + assert im.height == 3024 + assert im.bands == 3 + + self.file_loader("heifload", HEIC_FILE, heif_valid) + self.buffer_loader("heifload_buffer", HEIC_FILE, heif_valid) + self.save_load_buffer("heifsave_buffer", "heifload_buffer", + self.colour, 70) + self.save_load("%s.heic", self.colour) + + # test lossless mode + im = pyvips.Image.new_from_file(HEIC_FILE) + buf = im.heifsave_buffer(lossless=True) + im2 = pyvips.Image.new_from_buffer(buf, "") + # not in fact quite lossless + assert abs(im.avg() - im2.avg()) < 3 + + # higher Q should mean a bigger buffer + b1 = im.heifsave_buffer(Q=10) + b2 = im.heifsave_buffer(Q=90) + assert len(b2) > len(b1) + + # try saving an image with an ICC profile and reading it back + buf = self.colour.heifsave_buffer() + im = pyvips.Image.new_from_buffer(buf, "") + p1 = self.colour.get("icc-profile-data") + p2 = im.get("icc-profile-data") + assert 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 + + # test that exif changes change the output of heifsave + # 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("orientation", 6) + buf = x.heifsave_buffer() + y = pyvips.Image.new_from_buffer(buf, "") + assert y.get("orientation") == 6 + if __name__ == '__main__': pytest.main()