codec: compare 7 image encoding formats
[sheet.git] / codec.inc.pl
1 use utf8;
2 +{
3 codec => {
4         jpeg => {
5                 name => '<abbr title="Joint Photographic Experts Group">JPEG</abbr>',
6                 available => 1992,
7         },
8         png => {
9                 name => '<abbr title="Portable Network Graphics">PNG</abbr>',
10                 available => 1996,
11         },
12         jp2k => {
13                 name => 'JPEG 2000',
14                 available => 2000,
15         },
16         webp => {
17                 name => 'WebP',
18                 available => 2010,
19         },
20         heic => {
21                 name => '<abbr title="High Efficiency Image Container (HEVC in HEIF)">HEIC</abbr>',
22                 available => 2015,
23         },
24         avif => {
25                 name => '<abbr title="AV1 Image File Format">AVIF</abbr>',
26                 available => 2019,
27         },
28         jxl => {
29                 name => 'JPEG XL',
30                 available => 2021,
31         },
32 },
33 feature => {
34         quality_photo => {
35                 name => 'compression (photo)',
36                 score => {
37                         jpeg => 3,
38                         png  => 1,
39                         jp2k => 4,
40                         webp => 3,
41                         heic => 5,
42                         avif => 5,
43                         jxl  => 5,
44                 },
45         },
46         quality_photo_1 => {
47                 name => 'low fidelity',
48                 score => {
49                         jpeg => 2,
50                         png  => 1,
51                         jp2k => 3,
52                         webp => 3,
53                         heic => 5,
54                         avif => 5,
55                         jxl  => 4,
56                 },
57         },
58         quality_photo_2 => {
59                 name => 'medium fidelity',
60                 score => {
61                         jpeg => 3,
62                         png  => 1,
63                         jp2k => 4,
64                         webp => 3,
65                         heic => 4,
66                         avif => 5,
67                         jxl  => 5,
68                 },
69         },
70         quality_photo_3 => {
71                 name => 'high fidelity',
72                 score => {
73                         jpeg => 3,
74                         png  => 2,
75                         jp2k => 4,
76                         webp => 2,
77                         heic => 3,
78                         avif => 4,
79                         jxl  => 5,
80                 },
81         },
82         quality_photo_ll => {
83                 name => 'lossless',
84                 score => {
85                         jpeg => 1,
86                         png  => 2,
87                         jp2k => 4,
88                         webp => 3,
89                         heic => 3,
90                         avif => 3,
91                         jxl  => 5,
92                 },
93         },
94         quality_art => {
95                 name => 'compression (other images)',
96                 score => {
97                         jpeg => 2,
98                         png  => 3,
99                         jp2k => 2,
100                         webp => 4,
101                         heic => 3,
102                         avif => 4.5,
103                         jxl  => 5,
104                 },
105         },
106         quality_art_2 => {
107                 name => 'lossy non-photographic',
108                 score => {
109                         jpeg => 2,
110                         png  => 3,
111                         jp2k => 2,
112                         webp => 4,
113                         heic => 3,
114                         avif => 5,
115                         jxl  => 5,
116                 },
117         },
118         quality_art_ll => {
119                 name => 'lossless non-photographic',
120                 score => {
121                         jpeg => 1,
122                         png  => 4,
123                         jp2k => 2,
124                         webp => 5,
125                         heic => 2,
126                         avif => 3,
127                         jxl  => 5,
128                 },
129         },
130         quality_art_mixed => {
131                 name => 'mixed photo/nonphoto',
132                 score => {
133                         jpeg => 2,
134                         png  => 2,
135                         jp2k => 2,
136                         webp => 3,
137                         heic => 3,
138                         avif => 5,
139                         jxl  => 5,
140                 },
141         },
142         speed => {
143                 score => {
144                         jpeg => 5,
145                         png  => 4,
146                         jp2k => 3,
147                         webp => 4,
148                         heic => 3,
149                         avif => 3,
150                         jxl  => 5,
151                 },
152         },
153         speed_encode => {
154                 name => 'single-core encode',
155                 score => {
156                         jpeg => 5,
157                         png  => 3,
158                         jp2k => 4,
159                         webp => 4,
160                         heic => 3,
161                         avif => 2,
162                         jxl  => 5,
163                 },
164         },
165         speed_decode => {
166                 name => 'single-core decode',
167                 score => {
168                         jpeg => 5,
169                         png  => 5,
170                         jp2k => 4,
171                         webp => 5,
172                         heic => 3,
173                         avif => 3,
174                         jxl  => 5,
175                 },
176         },
177         speed_parallel => {
178                 name => 'pararellizable',
179                 score => {
180                         jpeg => 2,
181                         png  => 2,
182                         jp2k => 4,
183                         webp => 2,
184                         heic => 4,
185                         avif => 4,
186                         jxl  => 5,
187                 },
188         },
189         limits => {
190                 score => {
191                         jpeg => 3,
192                         png  => 4,
193                         jp2k => 5,
194                         webp => 2,
195                         heic => 4,
196                         avif => 4.5,
197                         jxl  => 5,
198                 },
199         },
200         max_dimensions => {
201                 name => 'maximum image dimensions',
202                 data => {
203                         jpeg => '65k²',  # 2**16
204                         png  => '2G²',   # 2**31
205                         jp2k => '4G²',   # 2**32
206                         webp => '16k²',  # 2**14
207                         heic => '8k×4k+', # 2**13
208                         avif => '8k×4k+',
209                         jxl  => '1G²',   # 2**30
210                 },
211         },
212         max_bitdepth => {
213                 name => 'precision (max. bit depth)',
214                 data => {
215                         jpeg => 8,
216                         png  => 16,
217                         jp2k => 38,
218                         webp => 8,
219                         heic => 10,
220                         avif => 10,
221                         jxl  => 32,
222                 },
223         },
224         color_444 => {
225                 name => 'can do (lossy) 4:4:4',
226                 score => {
227                         jpeg => 'y',
228                         png  => 'y',
229                         jp2k => 'y',
230                         webp => 'n',
231                         heic => 'n',
232                         avif => 'y',
233                         jxl  => 'y',
234                 },
235         },
236         hdr => {
237                 name => 'wide gamut/HDR',
238                 score => {
239                         jpeg => 'n',
240                         png  => 'y',
241                         jp2k => 'y',
242                         webp => 'n',
243                         heic => 'y',
244                         avif => 'y',
245                         jxl  => 'y',
246                 },
247         },
248         max_channels => {
249                 name => 'maximum number of channels',
250                 data => {
251                         jpeg => 4, # cmyk
252                         png  => 4, # cmyk
253                         jp2k => 2**15,
254                         webp => 4,
255                         heic => 5,
256                         avif => 5,
257                         jxl  => 4099,
258                 },
259         },
260         features => {
261                 score => {
262                         jpeg => 2,
263                         png  => 3,
264                         jp2k => 4,
265                         webp => 2,
266                         heic => 4,
267                         avif => 4,
268                         jxl  => 5,
269                 },
270         },
271         animation => {
272                 name => 'supports animation',
273                 score => {
274                         jpeg => 'n',
275                         png  => 'y',
276                         jp2k => 'n',
277                         webp => 'y',
278                         heic => 'y',
279                         avif => 'y',
280                         jxl  => 'y',
281                 },
282                 data => {
283                         jpeg => 'MJPEG',
284                         png  => 'APNG',
285                         jp2k => 'MJP2',
286                 },
287         },
288         progressive => {
289                 name => 'progressive decoding',
290                 score => {
291                         jpeg => 4,
292                         png  => 2,
293                         jp2k => 5,
294                         webp => 'n',
295                         heic => 'n',
296                         avif => 'n',
297                         jxl  => 5,
298                 },
299         },
300         alpha => {
301                 name => 'alpha transparency',
302                 score => {
303                         jpeg => 'n',
304                         png  => 'y',
305                         jp2k => 'y',
306                         webp => 'y',
307                         heic => 'y',
308                         avif => 'y',
309                         jxl  => 'y',
310                 },
311         },
312         depthmap => {
313                 name => 'depth map',
314                 score => {
315                         jpeg => 'n',
316                         png  => 'n',
317                         jp2k => 'n',
318                         webp => 'n',
319                         heic => 'y',
320                         avif => 'y',
321                         jxl  => 'y',
322                 },
323         },
324         overlays => {
325                 name => 'overlays',
326                 score => {
327                         jpeg => 'n',
328                         png  => 'n',
329                         jp2k => 'n',
330                         webp => 'n',
331                         heic => 'y',
332                         avif => 'y',
333                         jxl  => 'y',
334                 },
335         },
336         authoring => {
337                 name => 'authoring workflow suitability',
338                 score => {
339                         jpeg => 2,
340                         png  => 3,
341                         jp2k => 3,
342                         webp => 2,
343                         heic => 2,
344                         avif => 2,
345                         jxl  => 5,
346                 },
347         },
348         reencode => {
349                 name => 'generation loss resilience',
350                 score => {
351                         jpeg => 4,
352                         png  => 'n/a',
353                         jp2k => 3,
354                         webp => 2,
355                         heic => 3,
356                         avif => 3,
357                         jxl  => 4,
358                 },
359                 data => {
360                         png  => 'n/a',
361                 },
362         },
363         compat_jpeg => {
364                 name => 'lossless JPEG recompression',
365                 score => {
366                         jpeg => 0,
367                         png  => 'n',
368                         jp2k => 'n',
369                         webp => 'n',
370                         heic => 'n',
371                         avif => 'n',
372                         jxl  => 'y',
373                 },
374                 data => {
375                         jpeg => 'n/a',
376                 },
377         },
378         royalties => {
379                 name => 'royalty-free',
380                 score => {
381                         jpeg => 'y',
382                         png  => 'y',
383                         jp2k => 'y',
384                         webp => 'y',
385                         heic => 'n',
386                         avif => 'y',
387                         jxl  => 'y',
388                 },
389         },
390 },
391 }