Initializing... drag & drop files here
Supports: PPM
A folder of .ppm files is almost always a render, simulation or computer-vision pipeline writing one uncompressed frame at a time. Netpbm's own specification calls the layout "egregiously inefficient", and it is not exaggerating: every pixmap is a tiny ASCII header followed by raw RGB bytes, so a 480 x 360 frame is 518,415 bytes no matter what is in it. The short answer for that sequence is APNG if the frames are photographic, gradient-heavy or synthetic-smooth, and GIF only if you need a container older than 2017 to play it.
| Property | APNG (this page) | GIF | Animated WebP |
|---|---|---|---|
| Colour per frame | Full 24-bit RGB | 256-colour palette per frame | Full 24-bit RGB |
| Frame compression | Lossless (PNG deflate) | Palette + LZW | Lossy or lossless |
| Gradients and soft shading | Held exactly | Banded or dithered | Held well |
| Transparency model | 8-bit alpha | 1-bit on/off | 8-bit alpha |
| Timing resolution | Exact rational delay | Centiseconds | Milliseconds |
| Global browser support (caniuse) | 95.94% | Effectively universal | Broad in current browsers |
| Behaviour in a viewer that cannot decode it | Shows the first frame as a normal PNG | n/a | Usually fails to render |
| Our 12-frame gradient test sequence | 50,376 bytes | 614,447 bytes | — |
The last row is not a rounding difference. Palette formats have to approximate a smooth gradient with 256 colours plus dithering, and dither noise is expensive to compress; APNG simply stores the real pixels. On flat, low-colour frames the ordering reverses and GIF often wins, which is the honest reason both tools exist.
<img> tag with no video element, no autoplay policy and no muted-attribute gymnastics..apng. Files upload over an encrypted connection, are processed on our servers, and are deleted automatically after a few hours. No sign-up, no watermark.This is the behaviour that surprises people, so here it is measured rather than described. The assembler collapses consecutive identical frames, and a single upload is internally duplicated to form a two-frame sequence — which the assembler immediately merges back into one.
| Upload | Frames written | acTL animation chunk |
What you actually get |
|---|---|---|---|
| 1 PPM | 1 | absent | A plain static PNG carrying an .apng name — valid, viewable, but not animated |
| 12 distinct PPMs | 12 | present (with 12 fcTL and 11 fdAT chunks) |
A real looping animation |
So a single pixmap is not an error case, but it is not an animation either. If a still image is all you have and all you need, PPM to PNG is the honest destination. If you have a sequence, add all of it in one go — this tool has no way to append frames to an existing APNG afterwards.
No, it is how the assembler behaves. A single image is duplicated into a two-frame sequence, and because those two frames are byte-identical the assembler merges them back into one and writes no animation control chunk. We reproduced this and confirmed the output contains no acTL, fcTL or fdAT chunks at all — it is a static PNG with an .apng extension. Animation requires two or more genuinely different pixmaps.
Exactly the frame count divided by the framerate. The delay is written as a true rational value of 1/FPS rather than being rounded, so twelve frames at the default 10 FPS run for 1.2 seconds, and the same twelve at 25 FPS run for 0.48 seconds. There is no per-frame timing control — every frame gets the same delay.
No. The loop count is fixed at infinite and is not exposed as an option, so the animation repeats until the page or viewer is closed. If you need a play-once file you will need to edit the acTL num_plays field with a dedicated APNG tool afterwards, or target a video container instead.
No, but mismatched frames get normalised. The assembler cannot resize, so differently-sized uploads are first fitted onto one common canvas sized to the largest width and largest height in the set. Each smaller frame is scaled with its aspect ratio intact, centred, and padded out — never cropped or stretched. The padding is transparent, which APNG stores natively as 8-bit alpha, so it stays transparent in the final file rather than becoming a black or white bar.
Because palette quantization backfires on smooth content. We ran the same twelve 480 x 360 gradient frames through both makers this site uses — apngasm for APNG and gifski for GIF — and got 50,376 bytes of APNG against 614,447 bytes of GIF. GIF has to squeeze full-colour gradients into 256 palette entries and cover the error with dithering, and that dither noise is far harder to compress than the original smooth pixels. Reverse the content to flat two-colour artwork and GIF usually wins instead.
Almost, but not quite. caniuse currently puts APNG at 95.94% of tracked global browser usage — Chrome 59+, Firefox, Safari 8+, Edge 79+ and Opera 46+ all animate it. The gaps are Internet Explorer and Opera Mini, plus some desktop image viewers and chat previews that treat it as an unknown extension. The fallback is benign: anything that can read a PNG but not the animation chunks displays frame one as a still image.
For an ordinary 8-bit pixmap, no — APNG frames are compressed losslessly and this page exposes no quality, palette or colour-reduction control, so the RGB values arrive intact. There is one caveat for high-precision sources: Netpbm allows a maxval up to 65535, which means 16 bits per channel, and the pipeline normalises every uploaded image to an 8-bit PNG before assembly. We checked a maxval-65535 pixmap through that step and the resulting PNG reported a bit depth of 8, so a 16-bit pixmap is reduced to 8 bits per channel even though APNG itself could hold more. Frames larger than 4096 pixels on the long edge are also scaled down to fit that limit.
Your pixmaps are uploaded over an encrypted connection and assembled on our servers. Files are deleted automatically after a few hours, there is no sign-up and no watermark, and nothing is shared or made public.