Initializing... drag & drop files here
Supports: JPG, JPEG, JFIF
A .jfif file is an ordinary JPEG — opaque, lossy, full-colour photo data in the standard JPEG interchange wrapper — and a single one holds exactly one frame. So this page works as an APNG assembler: upload a set of JFIF photos and each becomes a frame of one animated PNG, played in upload order on an infinite loop. Because APNG stores full 24-bit colour instead of GIF's 256-entry palette, photographic frames keep their gradients and skin tones instead of being dithered into bands. Upload a single JFIF and there is nothing to animate — see the first FAQ, which explains exactly what you get instead.
.jfif, .jpg and .jpeg, and the order you add them is the order they play, so add the frames in sequence..apng. Files upload over an encrypted connection, are assembled on our servers, and are deleted automatically after a few hours — no sign-up, no watermark.APNG is a plain PNG with extra animation chunks, so the result can be inspected byte by byte. We assembled a three-frame test with the same APNG assembler this pipeline uses (APNG Assembler 2.91) and read the chunks back:
| Chunk | What we found | What it means |
|---|---|---|
IHDR |
8-bit, colour type 2 (truecolour RGB) | Full 24-bit colour, no palette quantisation |
acTL |
num_frames = 3, num_plays = 0 |
One frame per uploaded photo; zero means loop forever |
fcTL (each frame) |
delay 1 / 10 |
An exact rational delay of one tenth of a second at the default 10 FPS |
| Frame geometry | every frame at the full canvas size | Frames are composited, never cropped |
| Post-processing | Zopfli optimisation pass | Applied on a best-effort basis to shrink the finished file |
That exact-rational delay is a real APNG advantage. GIF stores each frame's delay in hundredths of a second, so any frame rate that is not a clean divisor gets rounded; APNG stores a numerator and denominator, so 12 FPS is exactly 1/12 second rather than an approximation.
| Property | APNG | GIF |
|---|---|---|
| Colour depth | 16.7 million colours (24-bit truecolour) | 256 colours per frame (8-bit palette) |
| Transparency | 8-bit alpha, smooth edges | 1-bit, hard on or off |
| Frame delay precision | Exact rational, e.g. 1/10 s | Hundredths of a second, rounded |
| Compression | PNG DEFLATE, lossless per frame | LZW over a quantised palette |
| Result with photographic frames | Clean gradients, larger file | Visible dithering and banding, smaller file |
| Browser support | 95.94% globally — Chrome 59+, Firefox 3+, Safari 8+, Edge 79+, Opera 46+; never Internet Explorer | Universal |
| Behaviour where unsupported | Only the first frame is displayed, as a normal static PNG | Not applicable |
For a sequence of photographs APNG is the better container, because your JFIF frames already carry colour a GIF palette would throw away. If you need an animation that plays literally everywhere including ancient clients, build a JFIF to GIF instead and accept the 256-colour limit.
This conversion deliberately exposes very little, because there is very little to decide. Under Advanced Options you get exactly three groups:
Controls you may have seen on other image pages — Colors and palette reduction, Image quality (%), Compression level, Bit Depth, Lossless — are not rendered for JFIF to APNG, and the output is left at full truecolour. Palette reduction is a GIF-family control: it appears on JFIF to GIF, alongside an Image quality (%) slider, because a GIF has to be quantised to 256 colours anyway. To shrink an APNG you have already built, compress APNG offers a target file size, an exact file size and a quality percentage — but no palette control there either, since APNG stays truecolour.
You get a still picture, not an animation. A single photograph has one frame, and when the assembler is handed two copies of an identical frame it collapses them back into one, so the file it writes carries no acTL animation chunk at all — it is a normal static PNG that happens to be named .apng. We verified this against the same assembler build the converter uses. To get real motion you need genuinely different frames: a burst of photos, a numbered export sequence, or successive stills of the same scene.
In the order you add them. The first file uploaded becomes frame one, the second becomes frame two, and so on, and every frame is held for the same interval set by the FRAMERATE control. If the sequence comes out wrong, remove the files and re-add them, or rename them with zero-padded numbers (01_, 02_, 03_) before uploading so the order is unambiguous. There is no per-frame reordering or per-frame timing on this page.
They are letterboxed onto a shared canvas rather than cropped. The converter measures every uploaded frame, takes the largest width and the largest height as the canvas, then scales each smaller frame to fit while preserving its aspect ratio, centres it, and pads the remaining area transparently. Nothing is stretched and nothing is cut off, but a set of mismatched photos will show transparent margins around the smaller ones. Uploading frames that already share dimensions avoids this entirely.
The APNG stage adds no new loss — PNG compression is lossless, so each frame is stored exactly as it was decoded. What it cannot do is undo the loss already baked in: JFIF is JPEG, so whatever compression the original camera or editor applied is part of the pixels before this converter ever sees them. APNG simply stops any further degradation and preserves the result in full truecolour. The cost is size, since lossless full-colour frames are considerably heavier than a palette-quantised GIF.
It loops forever. The assembler writes an acTL chunk with a play count of zero, which the APNG specification defines as infinite repetition, and this page exposes no control to change that. If you need a single-play animation, you would have to edit the num_plays field in the finished file with an APNG-aware tool. In practice an infinite loop is what almost every use of a photo-sequence APNG wants, which is why it is fixed.
Three levers exist here, and one more afterwards. Lower the FRAMERATE so fewer frames cover the same wall-clock duration; reduce Image resolution with a percentage or a preset so each frame carries fewer pixels; and upload fewer, more distinct frames rather than a long near-identical burst. The converter also runs a Zopfli optimisation pass over the finished animation automatically. If the result is still too heavy, compress APNG adds palette reduction and other levers that this conversion page deliberately leaves out.
APNG plays for about 95.94% of browser users worldwide: Chrome 59 and later, Firefox 3 and later, Safari 8 and later, Edge 79 and later, and Opera 46 and later, on desktop and mobile alike. Internet Explorer never supported it and neither did the legacy EdgeHTML versions. Crucially, the fallback is graceful — a viewer that does not understand the animation chunks simply displays the first frame as an ordinary PNG, so the image is never broken, it just does not move.
Use APNG when the frames are photographs and colour fidelity matters, which is the case for anything with skin tones, sky gradients or fine texture. Use JFIF to GIF when universal support beats quality, or when the frames are flat graphics where 256 colours is plenty. Use a video file when the sequence is long: a hundred-frame APNG of photographs will dwarf the equivalent MP4, because APNG stores every frame losslessly with no motion compensation between them. You can also convert an existing animation with APNG to GIF.
They are uploaded over an encrypted connection, decoded and assembled on our servers, and deleted automatically after a few hours — never shared, never made public, no sign-up and no watermark. Each frame is decoded from JPEG to raw pixels and re-encoded as PNG data inside the animation, so the output is a genuinely new file rather than a repackaging of your uploads.