1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
|
---
title: Gráficos PNG animados
slug: Gráficos_PNG_animados
tags:
- Firefox 3
- páginas_a_traducir
translation_of: Mozilla/Tech/APNG
---
<p></p>
<h3 id="Autores" name="Autores">Autores</h3>
<p>La especificación APNG fué escrita por:</p>
<ul>
<li>Stuart Parmenter <<a class="link-mailto" href="mailto:pavlov@pavlov.net" rel="freelink">pavlov@pavlov.net</a>></li>
<li>Vladimir Vukicevic <<a class="link-mailto" href="mailto:vladimir@pobox.com" rel="freelink">vladimir@pobox.com</a>></li>
<li>Andrew Smith <<a class="link-mailto" href="mailto:asmith15@littlesvr.ca" rel="freelink">asmith15@littlesvr.ca</a>></li>
</ul>
<p> </p>
<h3 id="Descripci.C3.B3n" name="Descripci.C3.B3n">Descripción</h3>
<p>APNG es una extensión del formato (PNG) <a class="external" href="http://www.w3.org/TR/PNG/">Portable Network Graphics</a> que agrega soporte para imágenes animadas. Se pretende que sea una simple sustitución de las imágenes animadas que tradicionalmente han utilizado el formato GIF, añadiendo soporte para imágenes de 24 bits y de 8-bit de transparencia. APNG es una alternativa simple a MNG, proporcionando una especificación adecuada para el uso común de imágenes animadas en Internet.</p>
<p>APNG es compatible con PNG y cualquier decodificador de formato PNG puede ignorar los fragmentos de APNG y mostrar la imagen codificada.</p>
<h4 id="Terminolog.C3.ADa" name="Terminolog.C3.ADa">Terminología</h4>
<p><strong>Imagen por defecto:</strong>se especifica en el fragmento 'IDAT' y es mostrada por decodificadores que no soporten APNG.</p>
<p><strong>Canvas</strong> is the area on the output device on which the frames are to be displayed. Los contenidos de los canvas no esta necesariamente disponible para el decodificador. As per the PNG Specification, if a 'bKGD' chunk exists it may be used to fill the canvas if there is no preferrable background.</p>
<p>The <strong>output buffer</strong> is a pixel array with dimensions specified by the width and height parameters of the PNG 'IHDR' chunk. Conceptually, each frame is constructed in the output buffer before being composited onto the canvas. The contents of the output buffer are available to the decoder. The corners of the output buffer are mapped to the corners of the canvas.</p>
<p><strong>Fully transparent black</strong> means red, green, blue and alpha components are all set to zero.</p>
<p>For purposes of chunk descriptions, an <code><strong>unsigned int</strong></code> shall be a 32-bit unsigned integer in network byte order limited to the range 0 to (2^31)-1; an <code><strong>unsigned short</strong></code> shall be a 16-bit unsigned integer in network byte order with the range 0 to (2^16)-1; and a <code><strong>byte</strong></code> shall be an 8-bit unsigned integer with the range 0 to (2^8)-1.</p>
<h4 id="Error_handling" name="Error_handling">Manejo de errores</h4>
<p>APNG is designed to allow incremental display of frames before the entire image has been read. This implies that some errors may not be detected until partway through the animation. It is strongly recommended that when any error is encountered decoders should discard all subsequent frames, stop the animation, and revert to displaying the default image. A decoder which detects an error before the animation has started should display the default image. An error message may be displayed to the user if appropriate.</p>
<h3 id="Estructura" name="Estructura">Estructura</h3>
<p>An APNG stream is a normal PNG stream as defined in the <a class="external" href="http://www.w3.org/TR/PNG/">PNG Specification</a>, with three additional chunk types describing the animation and providing additional frame data.</p>
<p>To be recognized as an APNG, an 'acTL' chunk must appear in the stream before any 'IDAT' chunks. The 'acTL' structure is described below.</p>
<p>Conceptually, at the beginning of each play the output buffer must be completely initialized to a fully transparent black rectangle, with width and height dimensions from the 'IHDR' chunk.</p>
<p>The default image may be included as the first frame of the animation by the presence of a single 'fcTL' chunk before 'IDAT'. Otherwise, the default image is not part of the animation.</p>
<p>Subsequent frames are encoded in 'fdAT' chunks, which have the same structure as 'IDAT' chunks, except preceded by a sequence number. Information for each frame about placement and rendering is stored in 'fcTL' chunks. The full layout of 'fdAT' and 'fcTL' chunks is described below.</p>
<p>The boundaries of the entire animation are specified by the width and height parameters of the PNG 'IHDR' chunk, regardless of whether the default image is part of the animation. The default image should be appropriately padded with fully transparent pixels if extra space will be needed for later frames.</p>
<p>Each frame is identical for each play, therefore it is safe for applications to cache the frames.</p>
<h3 id="Chunk_sequence_numbers" name="Chunk_sequence_numbers">Chunk sequence numbers</h3>
<p>The 'fcTL' and 'fdAT' chunks have a 4 byte sequence number. Both chunk types share the sequence. The purpose of this number is to detect (and optionally correct) sequence errors in an Animated PNG, since the PNG specification does not impose ordering restrictions on ancillary chunks.</p>
<p>The first 'fcTL' chunk must contain sequence number 0, and the sequence numbers in the remaining 'fcTL' and 'fdAT' chunks must be in order, with no gaps or duplicates.</p>
<p>The tables below illustrates the use of sequence numbers for images with more than one frame and more than one 'fdAT' chunk.</p>
<p><strong>If the default image is the first frame:</strong></p>
<table class="standard-table">
<tbody>
<tr>
<th>Sequence number</th>
<th>Chunk</th>
</tr>
<tr>
<td>(none)</td>
<td>'acTL'</td>
</tr>
<tr>
<td>0</td>
<td>'fcTL' (first frame)</td>
</tr>
<tr>
<td>(none)</td>
<td>'IDAT' (first frame -- used as the default image)</td>
</tr>
<tr>
<td>1</td>
<td>'fcTL' (second frame)</td>
</tr>
<tr>
<td>2</td>
<td>'fdAT' (first 'fDAT' for second frame)</td>
</tr>
<tr>
<td>3</td>
<td>'fdAT' (second 'fDAT' for second frame)</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
<p><strong>If the default image is not part of the animation:</strong></p>
<table class="standard-table">
<tbody>
<tr>
<th>Sequence number</th>
<th>Chunk</th>
</tr>
<tr>
<td>(none)</td>
<td>'acTL'</td>
</tr>
<tr>
<td>(none)</td>
<td>'IDAT' (default image)</td>
</tr>
<tr>
<td>0</td>
<td>'fcTL' (first frame)</td>
</tr>
<tr>
<td>1</td>
<td>First 'fdAT' for first frame</td>
</tr>
<tr>
<td>2</td>
<td>Second 'fDAT' for first frame</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
</tbody>
</table>
<p>Decoders must treat out-of-order APNG chunks as an error. APNG-aware PNG editors should restore them to correct order using the sequence numbers.</p>
<h3 id=".27acTL.27:_The_Animation_Control_Chunk" name=".27acTL.27:_The_Animation_Control_Chunk">'acTL': The Animation Control Chunk</h3>
<p>The 'acTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the first 'IDAT' chunk within a valid PNG stream.</p>
<p>The 'acTL' chunk contains:</p>
<table class="standard-table">
<tbody>
<tr>
<th>Byte offset</th>
<th>Field name</th>
<th>Field type</th>
<th>Description</th>
</tr>
<tr>
<td>0</td>
<td><code>num_frames</code></td>
<td><code>unsigned int</code></td>
<td>The number of frames in the APNG.</td>
</tr>
<tr>
<td>4</td>
<td><code>num_plays</code></td>
<td><code>unsigned int</code></td>
<td>The number of times to loop this APNG. 0 indicates infinite looping.</td>
</tr>
</tbody>
</table>
<p><code>num_frames</code> indicates the total number of frames in the animation. This must equal the number of 'fcTL' chunks. 0 is not a valid value. 1 is a valid value for a single-frame APNG. If this value does not equal the actual number of frames it should be treated as an error.</p>
<p><code>num_plays</code> indicates the number of times that this animation should play; if it is 0, the animation should play indefinitely. If nonzero, the animation should come to rest on the final frame at the end of the last play.</p>
<h3 id=".27fcTL.27:_The_Frame_Control_Chunk" name=".27fcTL.27:_The_Frame_Control_Chunk">'fcTL': The Frame Control Chunk</h3>
<p>The 'fcTL' chunk is an ancillary chunk as defined in the PNG Specification. It must appear before the 'IDAT' or 'fdAT' chunks of the frame to which it applies, specifically:</p>
<ul>
<li>For the default image, if a 'fcTL' chunk is present it must appear before the first 'IDAT' chunk. Position relative to the 'acTL' chunk is not specified.</li>
<li>For the first frame excluding the default image (which may be either the first or second frame), the 'fcTL' chunk must appear after all 'IDAT' chunks and before the 'fdAT' chunks for the frame.</li>
<li>For all subsequent frames, the 'fcTL' chunk for frame N must appear after the 'fdAT' chunks from frame N-1 and before the 'fdAT' chunks for frame N.</li>
<li>Other ancillary chunks are allowed to appear among the APNG chunks, including between 'fdAT' chunks.</li>
</ul>
<p>Exactly one 'fcTL' chunk is required for each frame.</p>
<table class="standard-table">
<tbody>
<tr>
<th>Byte offset</th>
<th>Field name</th>
<th>Field type</th>
<th>Description</th>
</tr>
<tr>
<td>0</td>
<td><code>sequence_number</code></td>
<td><code>unsigned int</code></td>
<td>Sequence number of the animation chunk, starting with 0.</td>
</tr>
<tr>
<td>4</td>
<td><code>width</code></td>
<td><code>unsigned int</code></td>
<td>Width of the following frame.</td>
</tr>
<tr>
<td>8</td>
<td><code>height</code></td>
<td><code>unsigned int</code></td>
<td>Height of the following frame.</td>
</tr>
<tr>
<td>12</td>
<td><code>x_offset</code></td>
<td><code>unsigned int</code></td>
<td>X position at which to render the following frame.</td>
</tr>
<tr>
<td>16</td>
<td><code>y_offset</code></td>
<td><code>unsigned int</code></td>
<td>Y position at which to render the following frame.</td>
</tr>
<tr>
<td>20</td>
<td><code>delay_num</code></td>
<td><code>unsigned short</code></td>
<td>Frame delay fraction numerator.</td>
</tr>
<tr>
<td>22</td>
<td><code>delay_den</code></td>
<td><code>unsigned short</code></td>
<td>Frame delay fraction denominator.</td>
</tr>
<tr>
<td>24</td>
<td><code>dispose_op</code></td>
<td><code>byte</code></td>
<td>Type of frame area disposal to be done after rendering this frame.</td>
</tr>
<tr>
<td>25</td>
<td><code>blend_op</code></td>
<td><code>byte</code></td>
<td>Type of frame area rendering for this frame.</td>
</tr>
</tbody>
</table>
<p>The frame must be rendered within the region defined by <code>x_offset</code>, <code>y_offset</code>, <code>width</code>, and <code>height</code>. The offsets must be non-negative, the dimensions must be positive, and the region may not fall outside of the default image.</p>
<p>Constraints on frame regions:</p>
<ul>
<li><code>x_offset</code> >= 0</li>
<li><code>y_offset</code> >= 0</li>
<li><code>width</code> > 0</li>
<li><code>height</code> > 0</li>
<li><code>x_offset</code> + <code>width</code> <= 'IHDR' width</li>
<li><code>y_offset</code> + <code>height</code> <= 'IHDR' height</li>
</ul>
<p>The <code>delay_num</code> and <code>delay_den</code> parameters together specify a fraction indicating the time to display the current frame, in seconds. If the denominator is 0, it is to be treated as if it were 100 (that is, <code>delay_num</code> then specifies 1/100ths of a second). If the the value of the numerator is 0 the decoder should render the next frame as quickly as possible, though viewers may impose a reasonable lower bound.</p>
<p>Frame timings should be independent of the time required for decoding and display of each frame, so that animations will run at the same rate regardless of the performance of the decoder implementation.</p>
<p><code>dispose_op</code> specifies how the output buffer should be changed at the end of the delay (before rendering the next frame).</p>
<p>Valid values for <code>dispose_op</code> are:</p>
<table class="standard-table">
<tbody>
<tr>
<th>Value</th>
<th>Constant</th>
<th>Description</th>
</tr>
<tr>
<td>0</td>
<td><code>APNG_DISPOSE_OP_NONE</code></td>
<td>No disposal is done on this frame before rendering the next; the contents of the output buffer are left as is.</td>
</tr>
<tr>
<td>1</td>
<td><code>APNG_DISPOSE_OP_BACKGROUND</code></td>
<td>The frame's region of the output buffer is to be cleared to fully transparent black before rendering the next frame.</td>
</tr>
<tr>
<td>2</td>
<td><code>APNG_DISPOSE_OP_PREVIOUS</code></td>
<td>The frame's region of the output buffer is to be reverted to the previous contents before rendering the next frame.</td>
</tr>
</tbody>
</table>
<p>If the first 'fcTL' chunk uses a <code>dispose_op</code> of <code>APNG_DISPOSE_OP_PREVIOUS</code> it should be treated as <code>APNG_DISPOSE_OP_BACKGROUND</code>.</p>
<p><code>blend_op<code> specifies whether the frame is to be alpha blended into the current output buffer content, or whether it should completely replace its region in the output buffer. </code></p>
<p>Valid values for <code>blend_op are:</p>
<table class="standard-table">
<tbody>
<tr>
<th>Value</th>
<th>Constant</th>
<th>Description</th>
</tr>
<tr>
<td>0</td>
<td><code>APNG_BLEND_OP_SOURCE</code></td>
<td>All color components of the frame, including alpha, overwrite the current contents of the frame's output buffer region.</td>
</tr>
<tr>
<td>1</td>
<td><code>APNG_BLEND_OP_OVER</code></td>
<td>The frame should be composited onto the output buffer based on its alpha, using a simple OVER operation as described in the <a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html#D.Alpha-channel-processing">Alpha Channel Processing</a> section of the <a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html">Extensions to the PNG Specification, Version 1.2.0</a>. Note that the second variation of the sample code is applicable.</td>
</tr>
</tbody>
</table>
<p>Note that for the first frame the two blend modes are functionally equivalent due to the clearing of the output buffer at the beginning of each play.</p>
<p>The 'fcTL' chunk corresponding to the default image, if it exists, has these restrictions:</p>
<ul>
<li>The <code>x_offset</code> and <code>y_offset</code> fields must be 0.</li>
<li>The <code>width</code> and <code>height</code> fields must equal the corresponding fields from the 'IHDR' chunk.</li>
</ul>
<p>As noted earlier, the output buffer must be completely initialized to fully transparent black at the beginning of each play. This is to ensure that each play of the animation will be identical. Decoders are free to avoid an explicit clear step as long as the result is guaranteed to be identical. For example, if the default image is included in the animation, and uses a <code>blend_op</code> of <code>APNG_BLEND_OP_SOURCE</code>, clearing is not necessary because the entire output buffer will be overwritten.</p>
<h3 id=".27fdAT.27:_The_Frame_Data_Chunk" name=".27fdAT.27:_The_Frame_Data_Chunk">'fdAT': The Frame Data Chunk</h3>
<p>The 'fdAT' chunk has the same purpose as an 'IDAT' chunk. It has the same structure as an 'IDAT' chunk, except preceded by a sequence number.</p>
<p>At least one 'fdAT' chunk is required for each frame. The compressed datastream is then the concatenation of the contents of the data fields of all the 'fdAT' chunks within a frame. When decompressed, the datastream is the complete pixel data of a PNG image, including the filter byte at the beginning of each scanline, similar to the uncompressed data of all the 'IDAT' chunks. It utilizes the same bit depth, color type, compression method, filter method, interlace method, and palette (if any) as the default image.</p>
<table class="standard-table">
<tbody>
<tr>
<th>Byte offset</th>
<th>Field name</th>
<th>Field type</th>
<th>Description</th>
</tr>
<tr>
<td>0</td>
<td><code>sequence_number</code></td>
<td><code>unsigned int</code></td>
<td>Sequence number of the animation chunk, starting from 0.</td>
</tr>
<tr>
<td>4</td>
<td><code>frame_data</code></td>
<td>X <code>bytes</code></td>
<td>Frame data for this frame.</td>
</tr>
</tbody>
</table>
<p>Each frame inherits every property specified by any critical or ancillary chunks before the first 'IDAT' in the file, except the width and height, which come from the 'fcTL' chunk.</p>
<p>If the PNG 'pHYs' chunk is present, the APNG images and their <code>x_offset</code> and <code>y_offset</code> values must be scaled in the same way as the main image. Conceptually, such scaling occurs while mapping the output buffer onto the canvas.</p>
<h3 id="Revisions_to_this_specification" name="Revisions_to_this_specification">Revisions to this specification</h3>
<h4 id="From_0.1" name="From_0.1">From 0.1</h4>
<ul>
<li>Renamed chunks to 'anIm' and 'frAm' to comply with chunk naming conventions in the PNG spec.</li>
</ul>
<ul>
<li>Added a more detailed explanation of APNG structure in Section 2.</li>
</ul>
<ul>
<li>Added information for png interaction with other chunks in section 3.2.</li>
</ul>
<ul>
<li>Changed 'frAm' chunk offsets and delay into signed integers.</li>
</ul>
<h4 id="From_0.2" name="From_0.2">From 0.2</h4>
<ul>
<li>Changed 'frAm' chunk to 'afRa' to avoid conflict with MNG 'FRAM' chunk.</li>
</ul>
<ul>
<li>Changed format: instead of sequences of IHDR..IDAT..IEND, frames other than frame 0 are stored in 'afRa' chunks.</li>
</ul>
<ul>
<li>Added <code>start_frame</code> to 'anIm' to indicate which frame the animation should start on.</li>
</ul>
<ul>
<li>Removed <code>num_frames</code> from 'anIm' chunk</li>
</ul>
<h4 id="From_0.3" name="From_0.3">From 0.3</h4>
<ul>
<li>Added 'aCTL', 'fdAT', 'fcTL' chunk descriptions as per the latest png-list discussion</li>
</ul>
<ul>
<li>Added section 4, "Interactions with other PNG chunks"; described global and local palettes and transparency</li>
</ul>
<ul>
<li>Changed 'oFFs' chunk section to refer to more general chunks</li>
</ul>
<ul>
<li>Updated 'aDAT' description to indicate that all frames must either be in a single chunk, or that the first chunk must have empty data.</li>
</ul>
<ul>
<li>Added notice that each frame's region (x,y,width,height) must lie completely within the parent PNG canvas</li>
</ul>
<ul>
<li>Fixed <code>dispose_op</code> description (after, not before)</li>
</ul>
<ul>
<li>Changed <code>dispose_op</code> to <code>render_op</code>; added disposal description; added <code>BLEND</code> flag</li>
</ul>
<ul>
<li>Changed <code>delay_time</code> to a delay numerator and denominator, for specifying delays that don't into integer numbers of milliseconds.</li>
</ul>
<ul>
<li>Added note to clarify that palette animation is not supported.</li>
</ul>
<ul>
<li>Removed <code>start_frame</code> from aCTL; require fcTL for frame 0; added <code>SKIP_FRAME</code> fCTL flag.</li>
</ul>
<h4 id="From_0.4" name="From_0.4">From 0.4</h4>
<ul>
<li>Reintroduced <code>num_frames</code> into aCTL</li>
</ul>
<ul>
<li>Moved <code>sequence_number</code> from aDAT into fCTL</li>
</ul>
<ul>
<li>Changed contents of aDAT to fCTL+IDATs+fEND</li>
</ul>
<ul>
<li>Added clarifications on what's allowed and what isn't</li>
</ul>
<ul>
<li>Renamed aCTL to acTL, fCTL to fcTL, aDAT to fdAT and fEND to feND to comply with the PNG spec chunk naming requirements</li>
</ul>
<h4 id="From_0.5" name="From_0.5">From 0.5</h4>
<ul>
<li>Added the IHDR and PLTE CRCs to the acTl chunk</li>
</ul>
<ul>
<li>The acTL fcTL and adAT are now copy safe, renamed them to acTl, fcTl and adAt</li>
</ul>
<h4 id="From_0.6" name="From_0.6">From 0.6</h4>
<ul>
<li>The fdAt chunk is no longer a container for other chunks, but rather a replacement for an IDAT chunk</li>
</ul>
<ul>
<li>Removed the feND chunk</li>
</ul>
<ul>
<li>Added a sequence number field to fdAt</li>
</ul>
<ul>
<li>Reintroduced the <code>width</code> and <code>height</code> fields in fcTl</li>
</ul>
<h4 id="From_0.7" name="From_0.7">From 0.7</h4>
<ul>
<li>Removed <code>hidden</code> flag, instead only the first frame can be hidden and it is signaled with a missing fcTl</li>
</ul>
<ul>
<li>IDAT, fcTl and fdAt are no longer required to have no other chunks in between them</li>
</ul>
<h4 id="From_0.8" name="From_0.8">From 0.8</h4>
<ul>
<li>Removed CRCs for IHDR and PLTE from acTl</li>
</ul>
<ul>
<li>The acTL fcTL and adAT are now not copy safe, renamed them to acTL, fcTL and adAT</li>
</ul>
<h4 id="From_0.9" name="From_0.9">From 0.9</h4>
<ul>
<li>Split <code>render_op</code> into <code>dispose_op</code> and <code>blend_op</code></li>
</ul>
<h4 id="From_0.10" name="From_0.10">From 0.10</h4>
<ul>
<li>No changes</li>
</ul>
<h3 id="Test_Encoder_and_Sample_Images" name="Test_Encoder_and_Sample_Images">Test Encoder and Sample Images</h3>
<p>Sample images are available from the APNG implementation page at <a class="external" href="http://littlesvr.ca/apng/" rel="freelink">http://littlesvr.ca/apng/</a></p>
<p>An encoder (open source) is available in versions of the Gecko engine starting with version 1.9 alpha 4.</p>
<p>An application (open source) using the Mozilla encoder to assemble APNGs available here: <a class="external" href="http://littlesvr.ca/apng/apngedit.html" rel="freelink">http://littlesvr.ca/apng/apngedit.html</a></p>
<h3 id="See_also" name="See_also">See also</h3>
<ul>
<li><a class="external" href="http://www.w3.org/TR/PNG/">Portable Network Graphics (PNG) Specification (Second Edition)</a></li>
<li><a class="external" href="http://pmt.sourceforge.net/specs/png-1.2-pdg.html">Extensions to the PNG Specification, Version 1.2.0</a></li>
<li><a class="external" href="http://www.w3.org/Graphics/GIF/spec-gif89a.txt">Graphics Interchange Format 89a</a></li>
</ul>
|