Image Format Converter

Media Client + Server image convert format png jpg jpeg webp gif svg bmp ico favicon heic tiff avif psd raw

This tool lets you choose: run it client-side in your browser (data never leaves your device), server-side (data is sent to the server), or compare both side by side. Check the mode selector below to see which one is active.

What it does

This tool converts an image from one format to another, including turning images into multi-resolution .ico files (16/32/48/256px) for use as favicons or Windows app icons.

The tool automatically detects which mode a given input file needs, and lets you override it manually if you want to compare both.

Try it

Original
Converted

Supported formats

FormatAs inputAs outputProcessing
PNGโœ…โœ…Client or server
JPG / JPEGโœ…โœ…Client or server
WebPโœ…โœ…Client or server
BMPโœ…โœ…Client or server
GIFโœ…โŒ (client)Client reads first frame only; server can too
SVGโœ…โŒRasterized as input, more reliably on the server
HEIC / HEIFโœ…โœ…Server only โ€” no browser decodes this natively
TIFFโœ…โœ…Server only
AVIFโœ…โœ…Server only (encoding); some browsers can display it
ICOโœ…โœ…Server only โ€” output is a multi-resolution icon (16/32/48/256px)
PSDโŒโŒNot an image format decoders understand โ€” unsupported everywhere
RAW (CR2/NEF/ARW/DNG)โŒโŒRequires a dedicated camera-raw decoder โ€” unsupported everywhere

How it works

Client-side path

  1. The chosen file is loaded into an <img> element using the browser's built-in decoder (PNG, JPG, WebP, GIF first frame, BMP, SVG).
  2. It's drawn onto a <canvas>.
  3. The canvas is re-encoded into the target format with canvas.toBlob().

Nothing leaves your device in this path.

Server-side path

  1. The file is read as a base64 data URL and sent to /api/tools/image-format-converter as JSON.
  2. tools/image-format-converter/server.js decodes it into a Buffer. HEIC/HEIF is pre-decoded with heic-convert, and .ico input is decoded with decode-ico (picking the largest embedded frame); both then flow through sharp/libvips for the requested output (PNG, JPEG, WebP, TIFF, AVIF). For .ico output, the source image is resized by sharp into the four standard icon sizes (256, 48, 32, 16px) and packed into a single .ico container by a small built-in encoder (lib/simple-ico-encoder.js) โ€” sharp/libvips can't write the ICO container format itself.
  3. The result is sent back as a base64 data URL and rendered/downloaded exactly like the client-side result.

The server does not persist the uploaded image anywhere โ€” it's held in memory only for the duration of the request.

Notes