5 name => '<abbr title="Joint Photographic Experts Group">JPEG</abbr>',
10 name => '<abbr title="Graphics Interchange Format">GIF</abbr>',
15 name => '<abbr title="Portable Network Graphics">PNG</abbr>',
30 name => '<abbr title="High Efficiency Image Container (HEVC in HEIF)">HEIC</abbr>',
35 name => '<abbr title="AV1 Image File Format">AVIF</abbr>',
45 name => '<abbr title="Portable aNyMap">PNM</abbr>',
52 children => [qw( quality_photo quality_art speed limits features royalties overhead support )],
55 name => 'compression (photo)',
67 children => [qw( quality_photo_1 quality_photo_2 quality_photo_3 quality_photo_ll )],
70 parent => 'quality_photo',
85 parent => 'quality_photo',
86 name => 'medium fidelity',
100 parent => 'quality_photo',
101 name => 'high fidelity',
114 quality_photo_ll => {
115 parent => 'quality_photo',
130 name => 'compression (other images)',
142 children => [qw( quality_art_2 quality_art_ll quality_art_mixed )],
145 name => 'lossy non-photographic',
159 name => 'lossless non-photographic',
172 quality_art_mixed => {
173 name => 'mixed photo/nonphoto',
198 children => [qw( speed_encode speed_decode speed_parallel )],
202 name => 'single-core encode',
206 gif => 3, # palette conversion
217 name => 'single-core decode',
232 name => 'pararellizable',
257 children => [qw( max_dimensions max_bitdepth color_444 hdr max_channels )],
261 name => 'maximum image dimensions',
263 jpeg => [3, '65k²'], # 2**16
265 gif => [3, '65k²'], # 2**16
266 png => [4, '2G²'], # 2**31
267 jp2k => [4, '4G²'], # 2**32
268 webp => [1, '16k²'], # 2**14
269 heic => [2,'8k×4k+', 'tilable, only 512×512 on Apple'], # 8193x4320
270 avif => [3, '65k²+', 'tilable, 7680×4320 with Advanced profile'], # 2**16
271 jxl => [4, '1G²'], # 2**30
276 name => 'precision (max. bit depth)',
279 pnm => [2, 8, 'unofficial PFM extension for 32-bit'],
280 gif => [1, 8, '256 colour palette per frame'],
284 heic => [3, 10], #TODO 16?
285 avif => [3, 12, '8, 10, 12 bit'],
286 jxl => [5, 32, '24-bit integer or 32-bit float'],
291 name => 'chroma subsampling',
293 jpeg => ['y', undef, '4:2:0, 4:2:2, 4:4:4'],
298 webp => [1, '4:2:0'],
299 heic => [1, '4:2:0'],
300 avif => ['y', undef, '4:2:0, 4:2:2, 4:4:4'],
301 jxl => ['y', undef, 'for JPEG compatibility'],
306 name => 'wide gamut/HDR',
321 name => 'maximum number of channels',
323 jpeg => [3, 4, 'RGB or CMYK'],
324 pnm => [3, 3, 'RGB'],
325 gif => [3, 3, 'RGB palette'],
326 png => [3, 4, 'RGBA'],
328 webp => [3, 4, 'RGBA'],
329 heic => [3, 3, 'RGB, separate alpha and depth'],
330 avif => [3, 3, 'RGB, separate alpha and depth'],
331 jxl => [4, 4099, 'native XYB'],
337 pnm => [2, undef, 'great for simplicity and ASCII storage'],
346 children => [qw( animation progressive alpha depthmap overlays authoring reencode compat_jpeg )],
349 parent => 'features',
350 name => 'supports animation',
352 jpeg => [2, 'MJPEG'],
355 png => [4, 'APNG', 'later backwards-compatible extension'],
364 parent => 'features',
365 name => 'progressive decoding',
379 parent => 'features',
380 name => 'alpha transparency',
383 pnm => ['n', undef, 'PAM extension'],
394 parent => 'features',
409 parent => 'features',
410 name => 'overlays (layers)',
424 parent => 'features',
425 name => 'authoring workflow suitability',
439 parent => 'features',
440 name => 'generation loss resilience',
454 parent => 'features',
455 name => 'lossless JPEG recompression',
469 name => 'royalty-free',
473 gif => [5, undef, 'patented before 2003'],
475 jp2k => [3, undef, 'ISO specification not freely available'],
476 webp => [4, undef, 'free format, low remaining risk of patent trolls'],
477 heic => ['n', undef, 'heavily patented'],
478 avif => [4, undef, 'free format, risk of patent trolls'],
479 jxl => [4, undef, 'free format, risk of patent trolls'],
489 jp2k => [2, undef, 'Apple only'],
490 webp => [4, undef, 'modern browsers'],
491 heic => [1, undef, 'stored by latest cameras, no browser support'],
492 avif => [3, undef, 'all modern browsers except Safari and Edge'],
493 jxl => [2, undef, 'upcoming in most browsers'],
497 name => 'container overhead (file size)',
499 png => [3, 67, 'upto 70 bytes for specific RGBA'],
500 jpeg => [2, 160, '159 bytes minimum for gray, 288 for specific colours'],
501 gif => [4, 35, '43 bytes for transparent'],
502 webp => [4, 34, 'black or transparent lossless; 44-92 bytes lossy'],
503 bpg => [4, 31, 'lossy 29-62 bytes, lossless 37-160'],
504 flif => [5, 14, 'black or transparent; 20 bytes for specific RGBA'],
505 pnm => [5, 8, 'monochrome text PBM; 12 bytes PPM; 69 bytes PAM'],
506 jxl => [5, 12, '512×256 black pixels'],
507 avif => [1, 282, 'container overhead; 457 bytes with alpha'],
508 jp2k => [2, 123, 'experimental results, likely not optimal'],