# avif



<u>Convertisseur:</u>

- squoosh-cli

- avif-cli
- cavif-rs
- sharp
- [avif.io](https://avif.io/)
- [squoosh](https://squoosh.app/)
- [XnConvert](https://www.xnview.com/fr/xnconvert/) 
- libheif
- avifenc
- go-avif
- AVIFQuickLook







### [squoosh-cli](https://www.npmjs.com/package/@squoosh/cli)

Supporte mozjpeg, webp, avif, jxl, wp2

Les options sont visibles dans [codecs.ts](https://github.com/GoogleChromeLabs/squoosh/blob/dev/libsquoosh/src/codecs.ts)

#### Installation:

```bash
$ npm i -g @squoosh/cli
```



#### Usage:

```bash
Usage: squoosh-cli [options] <files...>

Options:
  -d, --output-dir <dir>                                 Output directory (default: ".")
  -s, --suffix <suffix>                                  Append suffix to output files (default: "")
  --max-optimizer-rounds <rounds>                        Maximum number of compressions to use for auto optimizations (default: "6")
  --optimizer-butteraugli-target <butteraugli distance>  Target Butteraugli distance for auto optimizer (default: "1.4")
  --resize [config]                                      Resize the image before compressing
  --quant [config]                                       Reduce the number of colors used (aka. paletting)
  --rotate [config]                                      Rotate image
  --mozjpeg [config]                                     Use MozJPEG to generate a .jpg file with the given configuration
  --webp [config]                                        Use WebP to generate a .webp file with the given configuration
  --avif [config]                                        Use AVIF to generate a .avif file with the given configuration
  --jxl [config]                                         Use JPEG-XL to generate a .jxl file with the given configuration
  --wp2 [config]                                         Use WebP2 to generate a .wp2 file with the given configuration
  --oxipng [config]                                      Use OxiPNG to generate a .png file with the given configuration
  -h, --help                                             display help for command
```

```bash
$ squoosh-cli --webp true -d webp ./2022-04-28_Biche_8247_8b.png
1/1 ✔ Squoosh results:
 ./2022-04-28_Biche_8247_8b.png: 2.18MB
  └ webp/2022-04-28_Biche_8247_8b.webp → 75.00KB (3.37%)
```

```bash
$ squoosh-cli --output-dir 'squoosh-cli' --mozjpeg '{
   "quality":70,
   "baseline":false,
   "arithmetic":false,
   "progressive":true,
   "op timize_coding":true,
   "smoothing":0,
   "color_space":3,
   "quant_table":3,
   "trellis_multipass":false,
   "trellis_opt_zero":false,
   "trellis_opt_table":false,
   "trellis_loops":1,
   "auto_subsample":true,
   "chroma_sub sample":2,
   "separate_chroma_quality":false,
   "chroma_quality":75
}' png/2022-04-16_Brocard_8990_8b.png

1/1 ✔ Squoosh results:
 2022-04-16_Brocard_8990_8b.png: 1.93MB
  └ 2022-04-16_Brocard_8990_8b.jpg → 83.67KB (4.24%)
```

```bash
find . -name "*.jpg" -exec bash -c 'file="{}"; squoosh-cli --mozjpeg auto "$file"' \;
```



```bash
$ squoosh-cli --output-dir 'squoosh-cli' --avif '{
        "cqLevel":33,
        "cqAlphaLevel":-1,
        "denoiseLevel":0,
        "tileColsLog2":0,
        "tileRowsLog2":0,
        "speed":6,
        "subsample":1,
        "chromaDeltaQ":false,
        "sharpness":0,
        "tune":0
        }' png/*.png
        
$ squoosh-cli --output-dir 'squoosh-cli' --avif "{}" png/*.png
```



### ImageMagick

Mettre des options avec [define](https://imagemagick.org/script/defines.php).

#### Usage:

```bash
❯ magick -quality 75 png/2022-04-16_Brocard_8990_8b.png magick/2022-04-16_Brocard_8990_8b.avif

❯ magick -define heic:speed=2 png/2022-04-16_Brocard_8990_8b.png magick/2022-04-16_Brocard_8990_8b_2.avif

❯ convert -define heic:speed=2 png/2022-04-16_Brocard_8990_8b.png magick/2022-04-16_Brocard_8990_8b_2.avif
```

```bash
❯ for image in png/*.png ; do convert "$image" "${image%.*}.avif" ; done
```



### [avif-cli](https://github.com/lovell/avif-cli)

#### Installation:

```bash
$ npm install avif
```



#### Usage:

```bash
❯ npx avif --input="5_2019.jpg" --quality=70
 
❯ npx avif --input="**/*.{png}" --output="./avif-cli" --quality=70
```

```bash
#!/bin/sh
set -o noglob
IFS=$'\n'

quality=70
#quality='lossless'
images=$(find ./png -type f -name *.png)

for img in $images; do
	file=$(basename "$img")
	avif_out="avif-cli"

	#webp_out=$img.webp

	if [ ! -f $avif_out ]; then
		if [ "$quality" != "lossless" ]; then
	    	npx avif --input="$img" --output="./$avif_out" --quality=$quality
	    else
	    	npx avif --input="$img" --output="./$avif_out" --lossless
	    fi
	fi

done
```



### [cavif-rs](https://github.com/kornelski/cavif-rs)

Convert JPEG/PNG images to AVIF image format (based on AV1/rav1e)

#### Installation:

```bash
$ cargo install cavif
```



#### Usage:

```bash
❯ cavif --quality 90 2022-04-16_Brocard_8990_8b.png
2022-04-16_Brocard_8990_8b.avif: 524KB (522893B color, 0B alpha, 242B HEIF)
```

```bash
#!/bin/sh
set -o noglob
IFS=$'\n'

quality=70
images=$(find ./png -type f -name *.png)

for img in $images; do
	file=$(basename "$img")
	avif_out="cavif/${file%.*}_q$quality.avif"

	if [ ! -f $avif_out ]; then
    	cavif --quality $quality $img -o $avif_out
	fi

done
```



### [sharp](https://sharp.pixelplumbing.com)

#### Installation:

```bash
$ npm install sharp
```



#### Usage:

sharp-example.js

```javascript
const sharp = require('sharp')

const convertToAVIF = () => {
    sharp('path_to_image')
    .toFormat('avif', {palette: true})
    .toFile(__dirname + 'path_to_output_image')
}

convertToAVIF() 
```

```bash
# path_to_image : ./imgs/example.jpg
# path_to_output_image : /sharp-compressed/compressed-example.avif

$ node sharp-example.js
```



### [libheif](https://github.com/strukturag/libheif)

libheif is an ISO/IEC 23008-12:2017 HEIF and AVIF (AV1 Image File Format) file format decoder and encoder.

#### Installation:

```bash

./autogen.sh
./configure
go env -w GO111MODULE=off
make
```



#### Usage:

```bash
❯ heif-enc 2022-04-28_Biche_8247_8b.png -A -o 2022-04-28_Biche_8247_8b_3.avif
libpng warning: iCCP: known incorrect sRGB profile

❯ heif-enc 2022-04-28_Biche_8247_8b.png -A -L -p chroma=444 --matrix_coefficients=0 -o 2022-04-28_Biche_8247_8b_3.avif (lossless)
libpng warning: iCCP: known incorrect sRGB profile
```

```bash
# Paramètres par défaut

❯ heif-enc -P
Parameters for encoder `x265 HEVC encoder (3.4+31-6722fce1f)`:
  quality, default=50, [0;100]
  lossless, default=false
  preset, default=slow, { ultrafast,superfast,veryfast,faster,fast,medium,slow,slower,veryslow,placebo }
  tune, default=ssim, { psnr,ssim,grain,fastdecode }
  tu-intra-depth, default=2, [1;4]
  complexity, [0;100]
  chroma, default=420, { 420,422,444 }
```

```bash
#!/bin/sh
set -o noglob
IFS=$'\n'

#quality=70
quality='lossless'
images=$(find ./png -type f -name *.png)

for img in $images; do
	file=$(basename "$img")
	avif_out="heif-enc/${file%.*}_q$quality.avif"

	#webp_out=$img.webp

	if [ ! -f $avif_out ]; then
		if [ "$quality" != "lossless" ]; then
    		heif-enc "$img" -A -q $quality -o "$avif_out"
		else
    		heif-enc "$img" -A -L -p chroma=444 --matrix_coefficients=0 -o "$avif_out"
		fi
	fi

done
```



### avifenc

https://web.dev/compress-images-avif/

x64

#### Installation:

```bash
$ brew install joedrago/repo/avifenc
```



#### Usage:

```bash
$ avifenc --max 63 image.jpg image.avif
```



### avifenc (libavif)

#### Installation:

```bash
$ brew install libavif
```



#### Usage:

```bash
❯ avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim png/2022-04-16_Brocard_8990_8b.png avifenc/2022-04-16_Brocard_8990_8b.avif
```

```bash
# 8 thread

❯ avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim --jobs 8 png/2022-04-16_Brocard_8990_8b.png avifenc/2022-04-16_Brocard_8990_8b.avif
```

```bash
❯ avifenc --speed 0 --min 25 --max 35 png/2022-04-16_Brocard_8990_8b.png avifenc/2022-04-16_Brocard_8990_8b.avif
libpng warning: iCCP: known incorrect sRGB profile
Successfully loaded: png/2022-04-16_Brocard_8990_8b.png
AVIF to be written: (Lossy)
 * Resolution     : 1600x1067
 * Bit Depth      : 8
 * Format         : YUV444
 * Alpha          : Not premultiplied
 * Range          : Full
 * Color Primaries: 2
 * Transfer Char. : 2
 * Matrix Coeffs. : 6
 * ICC Profile    : Present (3144 bytes)
 * XMP Metadata   : Absent (0 bytes)
 * EXIF Metadata  : Absent (0 bytes)
 * Transformations: None
 * Progressive    : Unavailable
Encoding with AV1 codec 'aom' speed [0], color QP [25 (Medium) <-> 35 (Low)], alpha QP [0 (Lossless) <-> 0 (Lossless)], tileRowsLog2 [0], tileColsLog2 [0], 1 worker thread(s), please wait...
Encoded successfully.
 * Color AV1 total size: 70133 bytes
 * Alpha AV1 total size: 0 bytes
Wrote AVIF: avifenc/2022-04-16_Brocard_8990_8b.avif
```

```bash
#!/bin/sh
set -o noglob
IFS=$'\n'

#quality=70
quality='lossless'
images=$(find ./png -type f -name *.png)

for img in $images; do
	file=$(basename "$img")
	avif_out="avifenc/${file%.*}_q$quality.avif"

	#webp_out=$img.webp

	if [ ! -f $avif_out ]; then
		if [ "$quality" != "lossless" ]; then
	    	#npx avif --input="$img" --output="./$avif_out" --quality=$quality
	    	avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim --jobs 8 $img $avif_out
	    else
	    	#npx avif --input="$img" --output="./$avif_out" --lossless
	    	avifenc -l --jobs 8 $img $avif_out
	    fi
	fi

done
```



### [go-avif](https://github.com/Kagami/go-avif)

go-avif implements AVIF (AV1 Still Image File Format) encoder for Go using libaom, the high quality AV1 codec.
x64



### [AVIFQuickLook](https://github.com/dreampiggy/AVIFQuickLook)



### Bench

Conversion de 70 PNG 8bits:

| avif-cli | avifenc (libavif) | cavif | heif-enc (libheif) | squoosh-cli |      |
| -------- | ----------------- | ----- | ------------------ | ----------- | ---- |
| 148s     | 23s               | 183s  | 92s                | 107s        |      |

