pillow-avif-plugin icon indicating copy to clipboard operation
pillow-avif-plugin copied to clipboard

jpeg-files are smaller then de avif!

Open jvw1954 opened this issue 2 years ago • 1 comments

I resized a few tiff-files to jpeg and avif. The avif-files have more bytes. Are the avif images supposed to be smaller?

jaap@artio:/home/lia/data/graphics/django/toevoegen$ ls -lh /home/lia/data/graphics/django/img/width_600/
total 604K
-rw-r--r-- 1 jaap jaap 191K Jun 21 20:46 2022-04-02_grillige-vitaliteit.avif
-rw-r--r-- 1 jaap jaap 105K Jun 21 20:46 2022-04-02_grillige-vitaliteit.jpg
-rw-r--r-- 1 jaap jaap 202K Jun 21 20:46 2022-05-07T17:25:09_DePol.avif
-rw-r--r-- 1 jaap jaap  97K Jun 21 20:46 2022-05-07T17:25:09_DePol.jpg
jaap@artio:/home/lia/data/graphics/django/toevoegen$

jvw1954 avatar Jun 21 '22 21:06 jvw1954

Default image quality for JPEG is 75

Default image quality for AVIF is 90

Make sure to set quality manually with quality= in the .save

For a quick comparison we can see that AVIF files are smaller and higher quality across the board. Using a 12.6MB TIFF file as the source.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os

import pillow_avif
from PIL import Image
from SSIM_PIL import compare_ssim


def size(file):
    return f'{int(os.stat(file).st_size / 1024)}kb'


image = Image.open("test.tif")

image.save("test.avif")
image.save("test.jpg")

print("avif default - size:", size("test.avif"), "ssim", compare_ssim(image, Image.open("test.avif")))
print("jpeg default - size:", size("test.jpg"), "ssim", compare_ssim(image, Image.open("test.jpg")))

image.save("test_60.avif", quality=60)
image.save("test_60.jpg", quality=60)

print("avif 60 - size:", size("test_60.avif"), "ssim", compare_ssim(image, Image.open("test_60.avif")))
print("jpeg 60 - size:", size("test_60.jpg"), "ssim", compare_ssim(image, Image.open("test_60.jpg")))

image.save("test_80.avif", quality=80)
image.save("test_80.jpg", quality=80)

print("avif 80 - size:", size("test_80.avif"), "ssim", compare_ssim(image, Image.open("test_80.avif")))
print("jpeg 80 - size:", size("test_80.jpg"), "ssim", compare_ssim(image, Image.open("test_80.jpg")))


image.save("test_90.avif", quality=90)
image.save("test_90.jpg", quality=90)

print("avif 90 - size:", size("test_90.avif"), "ssim", compare_ssim(image, Image.open("test_90.avif")))
print("jpeg 90 - size:", size("test_90.jpg"), "ssim", compare_ssim(image, Image.open("test_90.jpg")))

Returns these results, (Higher is better with SSIM, 100 would be lossless)

avif default - size: 261kb ssim 0.9813569559864573
jpeg default - size: 153kb ssim 0.9659556786703601

avif 60 - size: 63kb ssim 0.9691338681132656
jpeg 60 - size: 120kb ssim 0.958656702062173

avif 80 - size: 112kb ssim 0.9753705947983995
jpeg 80 - size: 179kb ssim 0.9684979993844259

avif 90 - size: 261kb ssim 0.9813569559864573
jpeg 90 - size: 305kb ssim 0.9751634156663589

So we can see that a AVIF at 60 quality still has a higher SSIM than JPEG at default quality (75), and is almost a third of the size!

cdgriffith avatar Aug 06 '22 00:08 cdgriffith