Compress JPEG photos

Drop JPEGs below and get smaller JPEGs back. Lossless repacks the file without touching a pixel; Smart finds the lowest quality that still matches each photo. Up to 16 MB as a guest or 32 MB with a free account. Free. No account, no watermark.

  • Stays a JPG
  • Lossless option
  • Quality searched per photo

Balance between the image quality and compression

Output format

Auto tries every format your image can be saved as and gives you the smallest one

Resize

Change the width, height or scale of every image you upload

Original Dimensions Percentage
px
px

Set one side to keep the proportions, or both for an exact size.

Percentage
%

Size limit

Fit every image under a file size, for a form or a site with an upload limit

Any size Under a size
KB

Saved as JPG, WebP or AVIF. When quality alone can't get there, the image is made smaller to fit.

How the size limit works

Responsive image set

Pro

The image at several widths, with a srcset to paste into your page, so each screen loads the size it needs

One size Responsive set
px

Up to 8 widths, each in the format and at the level of the result. A width wider than the image stops at its own width, so nothing is enlarged.

How responsive sizes work

Keep EXIF Keeps details such as the camera, the date and the location in each file. Leave it off to remove them and save space.
Write alt text with AI Describes each image for screen readers and search engines, and suggests a file name
Alt text language
No language matches
English
Spanish
French
German
Italian
Portuguese
Dutch
Polish
Swedish
Turkish
Russian
Ukrainian
Arabic
Persian
Hebrew
Hindi
Indonesian
Vietnamese
Thai
Japanese
Korean
Simplified Chinese
Traditional Chinese
Rename files Downloads take the suggested name instead of the one you uploaded

Pro
Uploading a zip comes with Pro: the browser opens it and uploads its images in the folders they sat in, and the zip of the results keeps them. On your plan, unzip it and drop the images here. How folders and zips work

Up to 16 MB per image PNG, JPG, WEBP, GIF, HEIC, TIFF, or a ZIP of them on a paid plan

Guests get 10 images a day, 10 left today. A free account gets 40 a day and 7 days of Pro.

Upload a folder, or a zip

Pro

Pick a folder and every image in it uploads, with the folders inside it, and Download Selected gives them back in the same folders. A zip of images dropped on the box works the same way, opened in your browser.

How folders and zips work

Auto-start
On, each image starts compressing as soon as it uploads. Off, images wait in the box so you can check the settings, then start together.
Delete this image?
The image and its optimized copy will be removed from storage. This cannot be undone.

Rename this image
Choose the name the optimized image downloads with. Its format stays the same.

Uploaded as

Rename the selected images
Each image gets this name and a number, counted in the order they were uploaded. Their formats stay the same.

Share this image
AI alt text
Alt text

Paste it into the alt attribute of the image on your page.

Choose the compression level that suits your images
Level What it promises What happens Pick it when
Lossless
Not one pixel changes in a JPEG, PNG or GIF The file is repacked, never re-encoded. JPEGs get an optimised Huffman table and progressive scan, PNGs a tighter deflate pass, GIFs a lossless gifsicle run. A lossy WebP has no repack step, so it is re-encoded at the highest quality the level allows. A sideways phone JPEG is rotated losslessly on the way through and keeps its colour profile. The one exception to the promise is a PNG or WebP tagged with a wide-gamut profile such as Display P3: its colours are converted to sRGB, so the values change but the picture doesn't. Logos, line art, anything you'll edit again, or when the file is evidence.
Smart
No visible change, targets 40 dB PSNR and a perceptual score of 70 A quality search runs per image and stops at the lowest quality that still clears the PSNR target. That answer is then scored on the SSIMULACRA 2 scale, because an average over every pixel lets a mostly flat picture through at a quality its detail doesn't deserve, and when it falls under 70 the search moves back up until it doesn't. Photos and graphics end up at different qualities because they need different ones; an image that cannot reach the targets inside the quality ceiling is encoded at the ceiling. Almost everything on a website. This is the default for a reason.
Ultra
Smallest file, targets 34 dB PSNR and a perceptual score of 50 The same two-stage search with lower targets. Fine texture softens a little; edges and text stay sharp. Thumbnails, backgrounds, email images, anything shown small or blurred anyway.
None
No compression at all Only the resize, conversion or metadata setting you chose is applied. Without a resize or a conversion every pixel comes back as it was: the file only loses its metadata, and with Keep EXIF on it comes back byte for byte. You only wanted to resize or convert, and quality is someone else's decision.

Measured, not estimated

What compression did to five real JPEGs

The five JPG photographs from our showcase, compressed as JPG at each level. The range is the point: the same level saves very different amounts on different photos.

Sample Original Lossless Smart Ultra
Canoe at dusk 1800 by 1200 387 KB JPG 375 KB 3.3% smaller 125 KB 67.6% smaller 68 KB 82.4% smaller
Raspberries 1800 by 1200 342 KB JPG 332 KB 3% smaller 56 KB 83.7% smaller 46 KB 86.5% smaller
Night skyline 1800 by 1200 427 KB JPG 408 KB 4.3% smaller 236 KB 44.7% smaller 107 KB 74.8% smaller
Fjord 1800 by 1200 832 KB JPG 786 KB 5.6% smaller 555 KB 33.3% smaller 317 KB 61.9% smaller
Café interior 1800 by 1200 356 KB JPG 347 KB 2.4% smaller 90 KB 74.6% smaller 75 KB 78.9% smaller

Sources are 1800 by 1200 JPGs at quality 92. Metadata stripped, no resize. The landscape is dense foliage and needs a high quality to hold the target, so it gives up the least.

How it works

Why one quality number doesn't fit every photo

Most compressors give you a slider. Set it to 80 and a foggy sky comes out well while a brick wall comes out rough, because the same number costs different photos different amounts. In our tests one photo held a 40 dB target at quality 61 and another needed 95.

So Smart measures instead of guessing. It encodes your photo at several qualities with jpegli, compares each result with your upload, and keeps the smallest that clears 40 dB PSNR. Then it checks that result on the SSIMULACRA 2 scale and moves back up if it scores under 70. Ultra does the same with lower targets. The quality search runs on images up to 36 megapixels and the perceptual check on images up to 8; anything larger is encoded at the level's ceiling.

Lossless is a different operation altogether. mozjpeg's jpegtran rebuilds the file's Huffman tables and rearranges it into progressive scans without decoding it. Not one pixel changes, and no lossy result is ever delivered if it would be bigger than that repack.

What survives

What a JPEG keeps when it's compressed

  • Every pixel, at Lossless

    The repack works on the file's coefficients, never on decoded pixels, so the image is bit-for-bit what you uploaded.

  • The right way up, losslessly

    A sideways phone JPEG is turned by moving its blocks, not by re-encoding, so turning it usually costs nothing. When the dimensions leave edge blocks that can't be moved whole, Lossless keeps the pixels as stored with the orientation tag, and Smart and Ultra turn them as part of their one encode.

  • A wide-gamut profile, at Lossless

    Nothing on the lossless path can convert colours, so a Display P3 profile stays in the file. Smart and Ultra convert it to sRGB.

  • Metadata, unless you ask

    EXIF is stripped by default: camera, exposure, GPS. Turn on Keep EXIF to keep it.

When not to

When it won't help much

  • The JPEG was already compressed hard for the web. There's little left to remove, and Iminify hands back your original when nothing beats it.
  • The image is a screenshot or a logo. Those don't belong in a JPEG; a PNG or WebP of the source is sharper and smaller.
  • You can change format. The same photo as WebP or AVIF is usually smaller again, as the JPG to AVIF page shows.

How to

Compress a JPEG in three steps

  1. 1

    Drop your JPEGs

    Format stays on Original, so you get JPGs back. Both .jpg and .jpeg are accepted.

  2. 2

    Pick a level

    Lossless if the file is evidence or a master. Smart for the web. Ultra for thumbnails.

  3. 3

    Compare, then download

    The Compare view reports the PSNR between your upload and the result.

Questions

JPEG compression questions

Next

From the blog

What we've measured so far

We run the encoders on real photos and screenshots and publish the numbers: when WebP beats AVIF, what quality 80 means in each encoder, and how many kilobytes an image on a web page should weigh.

All posts
Bar chart of file sizes for a photo at four print sizes, 8x10 to 24x36. PNG bars run from 11.3 to 70.6 MB and JPEG bars from 1.4 to 6.5 MB, with a dashed line at Etsy's 20 MB limit.

How many pixels does an AI print need? 300 per inch, and at 16x20 our PNG is over Etsy's download limit

The usual answer is 300 pixels per inch of print: 2400 x 3000 for an 8x10, 4800 x 6000 for a 16x20, 7200 x 10800 for a 24x36. A square Midjourney 8.2 HD image is 2048 x 2048 and a square Gemini 4K image is 4096 x 4096, so neither reaches a 16x20 at that rate without more pixels. (Shops write DPI. Here it means pixels per inch of print.) From a 4K Gemini picture we made 16x20 files of 4800 x 6000 pixels: the PNG is 35.8 MB, over Etsy's 20 MB per file for digital downloads, and the JPEG is 3.6 MB.

7 min read
Two rows of seven squares, one per test post. After the default wp media regenerate, four squares are red and read 404 and three read 200; after --skip-delete and the rewrite, all seven read 200.

Convert your existing WordPress images to WebP without a plugin: what regenerate breaks

On a WordPress 7.1.4 test site, one filter and wp media regenerate turned the resized copies WordPress makes of five full-colour (4:4:4) photographs into WebP files with 62.5% of the JPEG copies' bytes. All 25 WebP copies, five sizes of each photograph, also scored lower. The filter and regenerate also left four of our seven test posts pointing at copies WP-CLI had just deleted, and took the srcset off all seven inserted images that had one. The version below leaves no address broken and gives six of those seven their srcset back: the filter, regenerate with one flag, and a rewrite that changes an address only where a WebP exists. The recipe as printed needs WP-CLI and a shell on the server.

8 min read
Bar chart of bytes Chrome downloaded at phone size for five 4K JPEGs on a Next.js static export page: 55.2 MB as they are, 10.2 MB as Smart JPG at full size, 1.29 MB at 1200 px wide, 767 KB through next-image-export-optimizer.

Next.js static export images: the default loader breaks them and unoptimized ships the original

We built a page with five photographs in a Next.js 16.4.3 App Router app, set output: 'export', left the image settings alone, and next build finished with exit code 0. In Chrome none of the five images loaded: every src pointed at /_next/image, an endpoint a static export doesn't contain. Setting images: { unoptimized: true } fixes that, and the export then serves the file you put in public/. Chrome at phone size downloaded 2.4 MB for five 1800 px photographs, and 55.2 MB when the same page held five 4K Gemini JPEGs. This post compares that flag, next-image-export-optimizer and resizing the files first by what Chrome downloaded at phone size and at desktop size. The table is in the second section, and the choice we'd make follows the three options.

7 min read

Make your JPEGs lighter

Drop a photo and open Compare. The PSNR is right there next to the slider.