PNG to GIF
Drop PNGs and get a GIF written in this tab. One PNG becomes a one-frame GIF; several PNGs become an animation, played in filename order at the delay you set. GIF has three hard limits — 256 colours per frame, one fully transparent colour, and delays in hundredths of a second — and the panel below is where you meet all three. No upload, no library, no account.
Drop PNGs here
or choose files · one picture or a whole sequence · up to 400 frames · or paste with Ctrl + V
PNG in, GIF89a out · one frame per PNG, played in filename order · 256 colours per frame · delays 0.02–5 s · up to 400 frames · no upload · no account · no watermark
PNG to GIF: The File Is a Header, Some Frames, and One Byte
An 11,208-byte GIF is not a mystery box. That one was 13 bytes of file header, 11,194 bytes of frame, and a single 0x3B trailer — 13 + 11,194 + 1 = 11,208, exactly. Add an animation and the header grows to 32 bytes, because a looping GIF carries a 19-byte NETSCAPE block that a still does not. The three-frame test further down came out at 32 + 146,191 + 1 = 146,224 bytes. Once you can add the pieces up, the only question left is what the frame bytes are made of — and the answer is colour, not compression.
That matters because "PNG to GIF" sounds like a rename with extra steps. It is not. A PNG can hold millions of colours, an alpha channel with 256 levels, and a lossless deflate stream. A GIF holds 256 colours per frame, one fully transparent colour, and LZW over a palette. Everything between those two descriptions is decided on this page, and every number below was produced here: a headless Chrome, this tool, real files.
Where the bytes actually go
The same 900 × 520 illustration at 480 × 277, dithered, one frame:
- 256 colours — 11,208 bytes
- 64 colours — 9,332 bytes
- 16 colours — 7,471 bytes
- 8 colours — 4,535 bytes
- 4 colours — 3,644 bytes
- 2 colours — 2,433 bytes
Halving the palette from 256 to 8 cut the file by 60%, and the picture at 8 colours is still recognisable — because a line drawing uses far fewer colours than the encoder is allowed to keep. GIF's LZW would have squeezed a larger palette too; it simply had less to squeeze once the colours were gone. This is the trade every converter makes quietly and this page lets you see: the size of a GIF is mostly a decision about how many colours you are willing to lose.
The source was 36,889 bytes of PNG, so 256 colours still came out 70% smaller. Most of that came from the narrower canvas: 480 px wide holds less than half the pixels of 900.
Dithering buys smoothness with bytes
At the same 64 colours, with dithering off, the file dropped from 9,332 to 8,311 bytes — 1,021 bytes, 11% of the larger file, spent on noise that makes gradients look continuous. On the 900 × 520 illustration that noise was worth having: bands in a flat sky are more objectionable than a slightly larger file. On a screenshot of text, turn it off; the diffused error just fuzzes the edges you wanted sharp.
A PNG sequence is the animation
A GIF's frame list is its own kind of edit. Drop three 800 × 600 PNGs and they become one GIF at 480 × 360, three frames at 0.10 s each — 0.30 s per loop. The three source PNGs totalled 1,469,087 bytes; the GIF came out at 146,224, encoded in 224 ms. Filename order is play order, and numbers inside names are compared as numbers: frame-2.png comes before frame-10.png, which is what a rendered sequence expects and what a plain alphabetical sort gets wrong.
Frames at different sizes are drawn into the first frame's box, so the proportions come from the first file in the list. The panel says how many frames were at another size rather than silently stretching them into a shape nobody asked for.
Transparency is one bit, and that is where a PNG really loses
A 600 × 400 PNG with a soft alpha channel went in at 3,670 bytes. Of its 240,000 pixels, 74,298 were fully transparent (31%) and another 15,065 carried partial alpha — a soft edge, an anti-aliased corner. GIF has one transparent index and no partial alpha at all, so those 15,065 pixels were pushed to one side of the alpha cutoff at 128 and cannot be half-visible.
Kept as a transparent GIF: 3,707 bytes. Painted onto white: 3,882 bytes. The transparent version was the smaller one here, which is not a rule — a matte fills the holes with a colour that has to be encoded, and a transparent index does not. What is a rule: after conversion, those 15,065 soft pixels are gone, and no setting on this page brings them back.
How to make a GIF from PNGs here
- Add the PNGs. Drop one file or a whole sequence on the box above; up to 400 frames, 60 MB each.
- Set the width and the palette. The width slider caps at the source's own width; the palette runs 2 to 256 colours per frame.
- Pick a delay. For a sequence this is the time each frame holds, 20 ms to 5,000 ms; a single PNG ignores it and plays once.
- Download. The preview is the real GIF89a file, and the download link hands you the same bytes.
What each control does
Width sets the canvas every frame is drawn into; height follows the first frame's proportions. Colours is the palette size handed to the median-cut quantiser, and "keep transparency" spends one of those slots on the transparent index, so the colour count you asked for is one short on the picture itself. Dither applies Floyd–Steinberg error diffusion row by row; transparent pixels take no part in it, since their colour never prints. Loop writes the NETSCAPE block — 19 bytes, present only when there is more than one frame. The background colour only matters when transparency is off.
Why this page doesn't upload your PNG
Everything here — the PNG decoder, the canvas, the palette cut, the LZW writer — is part of the browser. There is no server step to make a GIF smaller, and a round trip would add a copy of your file to someone else's disk.
To check it yourself, open DevTools (F12), switch to Network, and convert something: no request carries the image. Or load the page, pull the network cable, and convert again — the GIF is written the same way.
Questions that come up
Why is my GIF bigger than the PNG I started with? GIF's palette is a poor fit for photographic detail, and its LZW is weaker than the deflate stream inside PNG. On a 900 × 520 illustration at 256 colours the GIF was 11,208 bytes against a 36,889-byte PNG, but on a busy photo at full width it can go the other way. Drag the width down or the colours down and watch the number; if it stays larger, the PNG was the right format for that picture.
Can a GIF keep a soft, semi-transparent shadow? No. GIF stores one index as fully transparent and every other pixel as fully opaque, so a 15,065-pixel soft edge becomes hard. The page counts those pixels and reports them under the preview. If the shadow matters, this is the wrong output format — a PNG or a WebP keeps it.
Why did the animation come out at a different frame rate than I set? GIF stores delays in hundredths of a second, so a 33 ms frame rounds to 3/100 s and the sequence drifts. The floor is 2/100 s, because browsers treat 0 and 1 as 100 ms for compatibility. Pick a delay that divides evenly by 10 ms — 100 ms is 10/100 s and plays exactly as asked.
Does the order of my files matter? Yes, and it is decided by filename, not by the order you clicked them. Frames are sorted so that numbers inside names compare as numbers, which keeps frame-2 before frame-10. Rename the files if you need a different order, or add them one at a time as separate conversions.
What happens to the animation in an APNG? Only the first frame is used. An animated PNG carries its frames in extra chunks that the browser's decoder hands over as one image here, so the tool cannot step through them and does not pretend to. Split the APNG into PNG files first if you need every frame.
Is the GIF I get lossless for the pixels I gave it? No — the palette is a lossy step by construction, and the dither adds deliberate noise on top. What the page guarantees is that the file is a real GIF89a stream written here: the header says GIF89a, the logical screen is the size you picked, and the frame count matches the number of PNGs you added.
If you need the other direction — every frame of a GIF as separate PNGs, or a still — see GIF to PNG. For a GIF out of a video instead of a picture, MP4 to GIF trims and resamples; and if what you actually need is a favicon rather than an animation, PNG to ICO writes the multi-size container itself.