Illustration-style JPEG
- Input
- sample.jpg, 1200×800 baseline JPEG, 43,177 bytes, flat shapes over a sky gradient.
- Output
- 1200×800 GIF87a with a 256-colour palette, 72,884 bytes, in 45 ms; dithering kept the sky smooth at normal size.
JPG → GIF quantizes a photo to 256 colours, so it is for legacy systems that only accept GIF, not for making something animated or smaller.
From real runs
| Element | Result | What happens |
|---|---|---|
| Colour count | Changed | The JPEG's full colour range was reduced to an adaptive 256-entry palette; all 256 entries were used for the 1200×800 sample. |
| Gradients | Changed | A 200×100 patch of sky held 19 distinct colours in the JPEG and 17 in the GIF, with Floyd-Steinberg dithering hiding most of the banding. |
| Dimensions | Kept | 1200×800 in, 1200×800 out; no resampling happens unless width or height is set. |
| File size | Changed | The 43,177-byte JPEG became a 72,884-byte GIF: LZW on an indexed image does not compete with JPEG on photographs. |
| Animation | Kept | The output is a single-frame GIF87a; there is nothing to animate in a still JPEG and no frame is invented. |
| EXIF | Lost | GIF has no EXIF block, so camera, date and GPS tags are dropped regardless of the stripMetadata setting. |
| Transparency | Kept | JPEG has no alpha, and the GIF is written fully opaque; no colour is reserved as transparent. |
The JPEG's full colour range was reduced to an adaptive 256-entry palette; all 256 entries were used for the 1200×800 sample.
A 200×100 patch of sky held 19 distinct colours in the JPEG and 17 in the GIF, with Floyd-Steinberg dithering hiding most of the banding.
1200×800 in, 1200×800 out; no resampling happens unless width or height is set.
The 43,177-byte JPEG became a 72,884-byte GIF: LZW on an indexed image does not compete with JPEG on photographs.
The output is a single-frame GIF87a; there is nothing to animate in a still JPEG and no frame is invented.
GIF has no EXIF block, so camera, date and GPS tags are dropped regardless of the stripMetadata setting.
JPEG has no alpha, and the GIF is written fully opaque; no colour is reserved as transparent.
We converted our JPEG sample (42 KB) with Image engine on 2026-10-20. It took 150 ms and produced a 71 KB GIF file, 1.7× larger than the input. The engine raised 1 warning, listed below.
Input · sample.jpg · 42 KB
1200 × 800 px, baseline
Output · sample.gif · 71 KB
1200 × 800 px, GIF87a
Pillow
from PIL import Image
Image.open("in.jpg").convert("P", palette=Image.Palette.ADAPTIVE).save("out.gif")convert() dithers by default; pass dither=Image.Dither.NONE for flat posterized output.
ImageMagick
magick in.jpg -colors 256 out.gifAdd -dither None to disable dithering.
The HTTP API and the MCP server run the exact engine this page uses (Image engine); the response carries the same warnings the web converter shows. Check support first with GET /api/v1/pairs?from=jpg&to=gif.
curl -X POST https://filetypeconverters.com/api/v1/convert \
-H "Authorization: Bearer $FTC_API_KEY" \
-F "file=@input.jpg" -F "from=jpg" -F "to=gif" \
-F 'options={"dpi":96}' \
--output output.gif| Key | Applies to | Type | Default |
|---|---|---|---|
| dpi | Reading JPEG | number | 96 |
| width | Writing GIF | number | 0 |
| height | Writing GIF | number | 0 |
| fit | Writing GIF | contain · cover · fill | contain |
| quality | Writing GIF | number | 90 |
| background | Writing GIF | string | #ffffff |
| stripMetadata | Writing GIF | boolean | true |
JPEG compresses photographs by discarding detail the eye misses; GIF stores an indexed image with lossless LZW. On a 1200×800 photo-like picture that was 72,884 bytes of GIF against 43,177 of JPEG.
No. A JPEG is one frame, and the GIF holds that one frame. Animation needs several source images combined in sequence.
Gradients are dithered into the 256-colour palette, which reads as slight grain rather than bands at normal viewing size. Skin tones and sunsets show it most; flat graphics show it least.