Download a photo from Instagram and it often arrives noticeably softer and smaller than the image you were looking at. Not catastrophically — it is still recognisable — but a fraction of the file size it ought to be, and blurry once you zoom in. This is not compression damage. It is a downloader grabbing the wrong candidate from a list, and the wrong candidate is the easiest one to reach.
Instagram offers several versions of every photo
When Instagram serves a post, the page data does not contain one image URL. It contains a candidates array — several versions of the same photo at different sizes, generated so the app can pick one that suits the screen and connection showing it.
Near the top of that list, or easiest to reach depending on the page shape, sits a field built for the feed thumbnail: a version scaled to roughly 640 pixels on its long edge. It is small on purpose. Its job is to load instantly in a scrolling feed, not to be the archival copy of the image.
A naive extractor reads the JSON, takes the first plausible image URL it finds — frequently that 640px preview, or a display_url / display_uri field that points at the same downscaled version — and hands it over. The download succeeds, the file is a real photo, and it is a fraction of the size it should be.
The size difference is not marginal
This is easy to measure, and the gap is large. On a real 1660×982 landscape photo, the two paths produced:
- The easy path (the 640px preview): 57,865 bytes.
- The correct path (the full-resolution candidate): 504,608 bytes.
That is the same image, at roughly 8.7 times the data. The small file is not "compressed a bit more" — it is a different, smaller rendition of the picture, downscaled to a resolution built for a thumbnail. No amount of upscaling recovers the detail that was thrown away to make it; the pixels are simply not there.
So the difference between a good photo download and a poor one is not the download mechanism. It is which entry in the candidates array the tool chose.
The subtle trap: bigger is not always better
The obvious fix is "pick the largest candidate". That rule is wrong too, and it fails in a way that is harder to spot than the first problem.
Instagram does not only generate smaller versions of your photo. It also generates square and centre-cropped variants for surfaces that need a fixed aspect ratio — a profile grid, certain preview contexts. Some of those crops are dimensionally larger in one direction than the true original.
Take that same 1660×982 landscape photo — a wide, roughly 1.69:1 image. Among its candidates is a 981×982 square crop: taller than the original in pixels because it is nearly square, but it is a crop. It has thrown away the left and right of your wide photo to make a square. A "pick the largest" rule that compares raw dimensions can rank that square crop above the uncropped landscape, and hand you a photo that is missing half its width.
The correct order is: rank uncropped above cropped first, then compare sizes within the uncropped candidates. Aspect ratio is the primary key, resolution the secondary one. Reverse those and you get a large file of the wrong picture.
Sometimes the candidates carry no dimensions at all
There is a third failure, and it is the one that turns a working downloader into a broken one silently. On some page shapes — the server-rendered post page in particular — the candidate entries carry no width or height fields. The URLs are there; the dimensions are not.
A downloader that selects the best candidate by comparing widths now has nothing to compare. Every candidate looks like width zero, the comparison matches nothing meaningful, and the logic falls through to a default — which is, of course, the small display_url preview. The tool does not error. It just quietly serves the 640px version again, and this time it is not even choosing it, it is defaulting to it.
The real dimensions are still discoverable, just not where you would expect. Instagram encodes the resize directive inside the CDN URL itself, in a parameter that records the size the image was scaled to. Reading the intended size out of that directive — rather than out of a width field that may not exist — is how you rank candidates that otherwise carry no dimensions at all. It is the difference between a selector that works on every page shape and one that works only on the shapes that happen to include the numbers.
How to check what you actually got
You do not need any of the internals to verify a download. Two properties tell the whole story:
- Pixel dimensions. Right-click the file and open its properties (Windows) or Get Info (macOS), or run
ffprobe yourphoto.jpg, and read the width and height. If a photo you know was posted large comes out at 640 on its long edge, you got the thumbnail. If a wide landscape shot comes out square, you got a crop.
- File size. A full-resolution JPEG from Instagram is typically several hundred kilobytes to a few megabytes. A photo that lands at 50–70 KB is almost certainly the feed preview, whatever it looks like at a glance.
If both numbers match what you expect from the original, you have the real file. If either is off, the selector upstream picked the wrong candidate.
The aspect ratios Instagram actually supports
Knowing the shapes Instagram permits makes it easy to spot a crop masquerading as an original. A single-image post is stored in one of three aspect ratios:
- 4:5 — the tall portrait format, typically 1080×1350. The largest single-image format on the platform.
- 1:1 — the classic square, typically 1080×1080.
- 1.91:1 — the wide landscape format, typically 1080×566.
If you posted a wide 1.91:1 photo and your download is square, a crop was selected instead of the original. If you posted a 4:5 portrait and your file is 640 pixels tall, a preview was selected. The uncropped file will always match one of these three ratios; anything that does not is a variant Instagram generated for some other surface, not the picture you uploaded.
The correct selection — uncropped before cropped, real size read from the CDN URL's resize directive rather than a field that may be missing — is what the posts downloader does so you get the file at the dimensions it was published, not a thumbnail. For the video equivalent of the same "there is more than one version and most tools grab the worst" problem, the Reels quality guide covers the moving-image side.
A note on scope and rights: save photos you took, own the rights to, or have explicit permission from the person who posted them to keep. The size of the file does not change whose image it is — downloading someone else's photo needs their permission. And this is not legal advice; the rules on copying other people's images differ by country, so check what applies where you are.