Skip to content

Commit

Permalink
Removed qmin and qmax (#17)
Browse files Browse the repository at this point in the history
  • Loading branch information
radarhere authored Jan 25, 2025
1 parent 38f0d10 commit 1410d23
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 30 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/macos-install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ brew install \
dav1d \
aom \
rav1e \
ninja
svt-av1
if [[ "$ImageOS" == "macos13" ]]; then
brew install --ignore-dependencies libraqm
else
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/test-mingw.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
25 changes: 16 additions & 9 deletions docs/handbook/image-file-formats.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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``.
Expand All @@ -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"

Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion docs/installation/building-from-source.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
4 changes: 0 additions & 4 deletions src/PIL/AvifImagePlugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -218,8 +216,6 @@ def _save(
im.size[0],
im.size[1],
subsampling,
qmin,
qmax,
quality,
speed,
max_threads,
Expand Down
2 changes: 1 addition & 1 deletion src/PIL/features.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"),
Expand Down
17 changes: 4 additions & 13 deletions src/_avif.c
Original file line number Diff line number Diff line change
Expand Up @@ -234,8 +234,6 @@ AvifEncoderNew(PyObject *self_, PyObject *args) {
avifEncoder *encoder;

char *subsampling;
int qmin;
int qmax;
int quality;
int speed;
int exif_orientation;
Expand All @@ -255,12 +253,10 @@ AvifEncoderNew(PyObject *self_, PyObject *args) {

if (!PyArg_ParseTuple(
args,
"IIsiiiiissiiOOSSiSO",
"IIsiiissiiOOSSiSO",
&width,
&height,
&subsampling,
&qmin,
&qmax,
&quality,
&speed,
&max_threads,
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 1410d23

Please sign in to comment.