Bladeren bron

Fix saving as .heic

Matt Westcott 5 maanden geleden
bovenliggende
commit
15abe65eb4
3 gewijzigde bestanden met toevoegingen van 26 en 3 verwijderingen
  1. 1 1
      wagtail/images/image_operations.py
  2. 2 2
      wagtail/images/models.py
  3. 23 0
      wagtail/images/tests/test_image_operations.py

+ 1 - 1
wagtail/images/image_operations.py

@@ -409,7 +409,7 @@ class WebPQualityOperation(FilterOperation):
 
 
 class FormatOperation(FilterOperation):
-    supported_formats = ["jpeg", "png", "gif", "webp", "avif", "ico"]
+    supported_formats = ["jpeg", "png", "gif", "webp", "avif", "ico", "heic"]
 
     def construct(self, format, *options):
         self.format = format

+ 2 - 2
wagtail/images/models.py

@@ -1071,12 +1071,12 @@ class Filter:
                     "output-format-options" in env
                     and "lossless" in env["output-format-options"]
                 ):
-                    return willow.save_as_heif(output, lossless=True)
+                    return willow.save_as_heic(output, lossless=True)
                 elif "heic-quality" in env:
                     quality = env["heic-quality"]
                 else:
                     quality = getattr(settings, "WAGTAILIMAGES_HEIC_QUALITY", 80)
-                return willow.save_as_heif(output, quality=quality)
+                return willow.save_as_heic(output, quality=quality)
             elif output_format == "svg":
                 return willow.save_as_svg(output)
             elif output_format == "ico":

+ 23 - 0
wagtail/images/tests/test_image_operations.py

@@ -719,6 +719,29 @@ class TestFormatFilter(TestCase):
         # quality=80 is default for the Willow and PIL libraries
         save.assert_called_with(f, "WEBP", quality=80, lossless=True)
 
+    def test_heic(self):
+        fil = Filter(spec="width-400|format-heic")
+        image = Image.objects.create(
+            title="Test image",
+            file=get_test_image_file(),
+        )
+        out = fil.run(image, BytesIO())
+
+        self.assertEqual(out.format_name, "heic")
+
+    def test_heic_lossless(self):
+        fil = Filter(spec="width-400|format-heic-lossless")
+        image = Image.objects.create(
+            title="Test image",
+            file=get_test_image_file(),
+        )
+
+        f = BytesIO()
+        with patch("PIL.Image.Image.save") as save:
+            fil.run(image, f)
+
+        save.assert_called_with(f, "HEIF", quality=-1, chroma=444)
+
     def test_invalid(self):
         fil = Filter(spec="width-400|format-foo")
         image = Image.objects.create(