From 1410d23453fca292060ca546bbd0aba8073d51e3 Mon Sep 17 00:00:00 2001 From: Andrew Murray <3112309+radarhere@users.noreply.github.com> Date: Sun, 26 Jan 2025 03:00:44 +1100 Subject: [PATCH] Removed qmin and qmax (#17) --- .github/workflows/macos-install.sh | 2 +- .github/workflows/test-mingw.yml | 2 +- docs/handbook/image-file-formats.rst | 25 ++++++++++++++-------- docs/installation/building-from-source.rst | 2 +- src/PIL/AvifImagePlugin.py | 4 ---- src/PIL/features.py | 2 +- src/_avif.c | 17 ++++----------- 7 files changed, 24 insertions(+), 30 deletions(-) diff --git a/.github/workflows/macos-install.sh b/.github/workflows/macos-install.sh index 0c3e55eae..61ed7ba0d 100755 --- a/.github/workflows/macos-install.sh +++ b/.github/workflows/macos-install.sh @@ -17,7 +17,7 @@ brew install \ dav1d \ aom \ rav1e \ - ninja + svt-av1 if [[ "$ImageOS" == "macos13" ]]; then brew install --ignore-dependencies libraqm else diff --git a/.github/workflows/test-mingw.yml b/.github/workflows/test-mingw.yml index bf98d467f..5a83c16c3 100644 --- a/.github/workflows/test-mingw.yml +++ b/.github/workflows/test-mingw.yml @@ -60,10 +60,10 @@ jobs: mingw-w64-x86_64-gcc \ mingw-w64-x86_64-ghostscript \ mingw-w64-x86_64-lcms2 \ + mingw-w64-x86_64-libavif \ mingw-w64-x86_64-libimagequant \ mingw-w64-x86_64-libjpeg-turbo \ mingw-w64-x86_64-libraqm \ - mingw-w64-x86_64-libavif \ mingw-w64-x86_64-libtiff \ mingw-w64-x86_64-libwebp \ mingw-w64-x86_64-openjpeg2 \ diff --git a/docs/handbook/image-file-formats.rst b/docs/handbook/image-file-formats.rst index 119c4b4b8..63aa7f1de 100644 --- a/docs/handbook/image-file-formats.rst +++ b/docs/handbook/image-file-formats.rst @@ -1359,14 +1359,8 @@ as 8-bit RGB(A). The :py:meth:`~PIL.Image.Image.save` method supports the following options: **quality** - Integer, 1-100, defaults to 75. 0 gives the smallest size and poorest - quality, 100 the largest and best quality. The value of this setting - controls the ``qmin`` and ``qmax`` encoder options. - -**qmin** / **qmax** - Integer, 0-63. The quality of images created by an AVIF encoder are - controlled by minimum and maximum quantizer values. The higher these - values are, the worse the quality. + Integer, 0-100, defaults to 75. 0 gives the smallest size and poorest + quality, 100 the largest and best quality. **subsampling** If present, sets the subsampling for the encoder. Defaults to ``4:2:0``. @@ -1380,6 +1374,10 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: **speed** Quality/speed trade-off (0=slower-better, 10=fastest). Defaults to 6. +**max_threads** + Limit the number of active threads used. By default, there is no limit. If the aom + codec is used, there is a maximum of 64. + **range** YUV range, either "full" or "limited". Defaults to "full" @@ -1392,8 +1390,17 @@ The :py:meth:`~PIL.Image.Image.save` method supports the following options: For tile encoding, the (log 2) number of tile rows and columns to use. Valid values are 0-6, default 0. +**autotiling** + Split the image up to allow parallelization. Enabled automatically if "tile_rows" + and "tile_cols" both have their default values of zero. Requires libavif version + **0.11.0** or greater. + **alpha_premultiplied** - Encode the image with premultiplied alpha. Defaults to ``False`` + Encode the image with premultiplied alpha. Defaults to ``False``. Requires libavif + version **0.9.0** or greater. + +**advanced** + Codec specific options. Requires libavif version **0.8.2** or greater. **icc_profile** The ICC Profile to include in the saved file. diff --git a/docs/installation/building-from-source.rst b/docs/installation/building-from-source.rst index 9bf88c62a..c817b4c08 100644 --- a/docs/installation/building-from-source.rst +++ b/docs/installation/building-from-source.rst @@ -170,7 +170,7 @@ Many of Pillow's features require external libraries: instead of installing libavif through Homebrew directly, you can use Homebrew to install libavif's build dependencies:: - brew install aom dav1d rav1e + brew install aom dav1d rav1e svt-av1 Then see ``depends/install_libavif.sh`` to install libavif. diff --git a/src/PIL/AvifImagePlugin.py b/src/PIL/AvifImagePlugin.py index 2696599c5..8125b548a 100644 --- a/src/PIL/AvifImagePlugin.py +++ b/src/PIL/AvifImagePlugin.py @@ -156,8 +156,6 @@ def _save( is_single_frame = total == 1 - qmin = info.get("qmin", -1) - qmax = info.get("qmax", -1) quality = info.get("quality", 75) if not isinstance(quality, int) or quality < 0 or quality > 100: msg = "Invalid quality setting" @@ -218,8 +216,6 @@ def _save( im.size[0], im.size[1], subsampling, - qmin, - qmax, quality, speed, max_threads, diff --git a/src/PIL/features.py b/src/PIL/features.py index 504b0e6eb..573f1d412 100644 --- a/src/PIL/features.py +++ b/src/PIL/features.py @@ -289,8 +289,8 @@ def pilinfo(out: IO[str] | None = None, supported_formats: bool = True) -> None: ("freetype2", "FREETYPE2"), ("littlecms2", "LITTLECMS2"), ("webp", "WEBP"), - ("jpg", "JPEG"), ("avif", "AVIF"), + ("jpg", "JPEG"), ("jpg_2000", "OPENJPEG (JPEG2000)"), ("zlib", "ZLIB (PNG/ZIP)"), ("libtiff", "LIBTIFF"), diff --git a/src/_avif.c b/src/_avif.c index d2ec64389..c50516710 100644 --- a/src/_avif.c +++ b/src/_avif.c @@ -234,8 +234,6 @@ AvifEncoderNew(PyObject *self_, PyObject *args) { avifEncoder *encoder; char *subsampling; - int qmin; - int qmax; int quality; int speed; int exif_orientation; @@ -255,12 +253,10 @@ AvifEncoderNew(PyObject *self_, PyObject *args) { if (!PyArg_ParseTuple( args, - "IIsiiiiissiiOOSSiSO", + "IIsiiissiiOOSSiSO", &width, &height, &subsampling, - &qmin, - &qmax, &quality, &speed, &max_threads, @@ -327,17 +323,12 @@ AvifEncoderNew(PyObject *self_, PyObject *args) { _codec_available("aom", AVIF_CODEC_FLAG_CAN_ENCODE)); encoder->maxThreads = is_aom_encode && max_threads > 64 ? 64 : max_threads; - if (qmin == -1 || qmax == -1) { #if AVIF_VERSION >= 1000000 - encoder->quality = quality; + encoder->quality = quality; #else - encoder->minQuantizer = normalize_quantize_value(64 - quality); - encoder->maxQuantizer = normalize_quantize_value(100 - quality); + encoder->minQuantizer = normalize_quantize_value(64 - quality); + encoder->maxQuantizer = normalize_quantize_value(100 - quality); #endif - } else { - encoder->minQuantizer = normalize_quantize_value(qmin); - encoder->maxQuantizer = normalize_quantize_value(qmax); - } if (strcmp(codec, "auto") == 0) { encoder->codecChoice = AVIF_CODEC_CHOICE_AUTO;