fdintino / pillow-avif-plugin

A pillow plugin that adds avif support via libavif
BSD 2-Clause "Simplified" License
77 stars 12 forks source link

Strange behavior of the quality parameter #6

Closed Lucuz91 closed 2 years ago

Lucuz91 commented 2 years ago

First of all, thanks for this plugin :)

I was testing it to see the potential of the AVIF format, but I noticed a strange behavior of the quality parameter, in the range 26-60 there is no variation on the file size, as if the parameter is set to the same value internally. Here is a simple code that demonstrates this behavior:

from PIL import Image
import pillow_avif, os

img = Image.open('fox.jpg')

for i in range(1, 100):
    img.save('fox.avif', quality=i)
    print(f'quality={i}, size={os.path.getsize("fox.avif")}')
quality=1, size=4770
quality=2, size=5900
quality=3, size=6803
quality=4, size=7834
quality=5, size=8655
quality=6, size=9416
quality=7, size=10376
quality=8, size=11343
quality=9, size=12430
quality=10, size=13434
quality=11, size=14512
quality=12, size=15660
quality=13, size=16981
quality=14, size=18484
quality=15, size=20152
quality=16, size=21868
quality=17, size=23922
quality=18, size=25918
quality=19, size=28302
quality=20, size=31152
quality=21, size=33862
quality=22, size=36551
quality=23, size=39922
quality=24, size=43672
quality=25, size=46826
quality=26, size=51335
quality=27, size=54303
quality=28, size=54303
quality=29, size=54303
quality=30, size=54303
quality=31, size=54303
quality=32, size=54303
quality=33, size=54303
quality=34, size=54303
quality=35, size=54303
quality=36, size=54303
quality=37, size=54303
quality=38, size=54303
quality=39, size=54303
quality=40, size=54303
quality=41, size=54303
quality=42, size=54303
quality=43, size=54303
quality=44, size=54303
quality=45, size=54303
quality=46, size=54303
quality=47, size=54303
quality=48, size=54303
quality=49, size=54303
quality=50, size=54303
quality=51, size=54303
quality=52, size=54303
quality=53, size=54303
quality=54, size=54303
quality=55, size=54303
quality=56, size=54303
quality=57, size=54303
quality=58, size=54303
quality=59, size=54303
quality=60, size=54303
quality=61, size=54303
quality=62, size=54303
quality=63, size=55315
quality=64, size=59169
quality=65, size=63845
quality=66, size=68947
quality=67, size=72714
quality=68, size=75959
quality=69, size=80929
quality=70, size=85229
quality=71, size=89238
quality=72, size=93265
quality=73, size=96826
quality=74, size=100943
quality=75, size=105397
quality=76, size=110830
quality=77, size=113992
quality=78, size=117824
quality=79, size=120809
quality=80, size=124907
quality=81, size=129940
quality=82, size=133467
quality=83, size=137476
quality=84, size=141220
quality=85, size=146732
quality=86, size=151571
quality=87, size=157321
quality=88, size=163891
quality=89, size=173365
quality=90, size=180485
quality=91, size=190560
quality=92, size=200989
quality=93, size=212612
quality=94, size=222848
quality=95, size=235191
quality=96, size=250759
quality=97, size=272393
quality=98, size=298760
quality=99, size=357944

Here instead the source image: fox

I also tried other images, but the behavior is always similar, there is a range of quality (I would say considerable) in which the image does not change, am I doing something wrong?

fdintino commented 2 years ago

Under the hood AVIF takes minimum and maximum quantizer values, ranging from 0 to 63. You can pass those directly, but I allowed passing a JPEG-like 0-100 quality parameter that maps to quantizer values. The code that transforms the setting is here:

https://github.com/fdintino/pillow-avif-plugin/blob/f9ea38ae41bdfff0771f7b7371f804ab4e248d33/src/pillow_avif/AvifImagePlugin.py#L130-L143

I borrowed this logic from colorist (link). It's not perfect, but it's a reasonable approximation. I have docs for the save options in my PR to Pillow, you can find those here.

Lucuz91 commented 2 years ago

Thanks for the reply, I tried to search around the internet but actually I couldn't find any better way to manage quality with 1-100 scale. In case I find a better solution I will write it here ;)

Thanks again for your work