Originally published on DEV.to — tested with SquareImage.
I build SquareImage, a small set of in-browser square-image tools. This week I put its Instagram grid maker through two jobs people keep asking about: turning a wide panorama into a carousel you can swipe through without a visible break, and splitting one big photo into a 3×3 profile mosaic. I ran both on large public-domain photos from Wikimedia Commons and checked every output file in Python.
Short version: the panorama trick works, and the three slides come out 90% smaller than the source. The 3×3 mosaic also works, but the tall profile grid Instagram rolled out in 2025 will clip the edges of every tile, so where your subject sits matters more than it used to.
What Instagram actually says (checked 2026-11-03)
I only used Instagram's own pages for the facts below:
- Carousels: up to 20 photos and videos per post. "The orientation you choose (square, portrait or landscape) affects all of the photos or videos in your post. You can't select a different orientation for each." Your profile shows the first item. After sharing you can reorder or remove items, but you can't add new ones. (Help Center: multiple photos)
- Resolution: photos are shared at up to 1080 px wide. The original resolution is kept for widths of 320–1080 px with an aspect ratio between 1.91:1 and 3:4. Other ratios get cropped. (Help Center: image resolution)
- Profile grid: Adam Mosseri announced the "tall grid" in January 2025, saying rectangles do a better job than squares now that most uploads are vertical (Threads post). The Help Center doesn't give an exact thumbnail ratio. Third-party guides usually measure it as 3:4, so that's the ratio I simulate below. Treat it as a measurement, not an official spec.
So a 1:1 carousel of 1080×1080 slides is fully supported. A square 3×3 mosaic still posts fine, but on the profile each square tile is shown through a taller window.
Job 1: a 3:1 panorama → seamless 3-slide carousel
Sample: Coibita Island Panorama by Nosferattus (CC0), 11,722 × 3,902 px, 13,992,807 bytes. The width is almost exactly 3× the height, which is what makes this trick work.
The grid maker has no dedicated "panorama" button. It splits into 2×2, 3×3 or 4×4 squares. But a 3:1 panorama padded to a square takes up exactly the middle row of a 3×3 grid, so the middle three tiles are your carousel.
Step 1: open the tool and drop the photo
Everything runs in the browser. My request log showed no POST of the 14 MB file; the only network traffic was the page assets themselves.
Step 2: notice what "Cropping" does to a panorama
The default is Cropping, which fills a square from the centre. For this photo that keeps 3,902 of 11,722 px of width, which is 33.3%. Two thirds of the beach is gone.
Step 3: switch to Padding, keep 3×3, JPEG, and download
Padding keeps the whole photo and adds white above and below. With a 3:1 source, that white fills the top and bottom rows exactly. "Download all tiles" saved nine files:
| Tiles | What they are | Size each |
|---|---|---|
| grid-01–03, 07–09 | pure white (bin these) | 7,694 B |
| grid-06 | slide 1 (left) | 488,500 B |
| grid-05 | slide 2 (middle) | 313,384 B |
| grid-04 | slide 3 (right) | 556,299 B |
All are 1080 × 1080 px JPEGs. The three real slides total 1,358,183 bytes, 9.7% of the 13,992,807-byte source (−90.3%), and they're already at Instagram's 1080 px width, so nothing gets rescaled on upload.
One gotcha: the filenames are numbered for profile-grid posting order (newest post shows top-left), so they run right-to-left. For a carousel, pick them 06 → 05 → 04.
Step 4: check the seams
I compared the last pixel column of each slide with the first column of the next (mean absolute difference, 0–255 scale):
- slide 1 → 2: 5.75
- slide 2 → 3: 4.60
- two neighbouring columns inside one slide: 4.50
The jump at each cut is about the same as the change between any two neighbouring columns, so there's no visible break when you swipe. Putting them in the wrong order (04 → 05) gives 72.8, a hard edge you'd notice. None of the slides has a white band at its top or bottom edge either: 3,902 × 3 is within a few pixels of 11,722, so the padding falls almost entirely in the discarded rows.
Rule of thumb: crop your panorama to exactly 3:1 before splitting, and use 3×3. With an odd grid, an N:1 panorama lands neatly in the middle row. With 2×2 or 4×4, the padded panorama straddles a row boundary, so the slides come out half white.
Job 2: one photo → 3×3 profile mosaic
Sample: Podersdorf Lighthouse 1 by Dimitry Anikin (CC0), 10,266 × 7,700 px, 24,607,534 bytes.
Step 1: 3×3, Cropping, JPEG
Cropping takes the centre square (x = 1,283 → 8,983) and drops 25% of the width. The nine 1080 × 1080 tiles total 805,987 bytes, 3.3% of the source (−96.7%).
Step 2: the problem, a seam in the subject
The tower's red-and-white body spans x = 3,344–3,836 in the original. The first column cut is at x ≈ 3,850, so the whole tower is squeezed against the right edge of the left column and the lantern gallery pokes across the cut.
That's fine on the old square grid. Now simulate the tall profile: each square tile is shown through a 3:4 window, which keeps the centre 75% of its width and hides 12.5% on each side.
In the tall view, only 38% of the tower's width is still visible. The rest falls in the hidden strip at the tile's edge.
Step 3: the fix, put the subject in the middle column first
The grid maker always crops from the centre and has no drag-to-reposition. So I cropped the photo to its left 7,700 × 7,700 square first (Pillow, quality 95, 9,477,077 B) and ran the same 3×3 split again. The tower now sits at ~47% across, inside the middle column, and 100% of it stays visible in the tall view. Nine tiles, 754,701 bytes total.
If you'd rather not touch Python, any square cropper where you choose the frame position will do, then feed the result to the grid maker. The Instagram square guide covers framing for single posts.
Checklist
- Panorama carousel: crop to 3:1, then choose 3×3 + Padding. Keep tiles 06, 05, 04 and post them in that order as one 1:1 carousel (Instagram applies one orientation to all slides).
- Profile mosaic: keep the subject away from the outer 12.5% of every tile column, because the tall grid hides it. Better still, put it fully inside the middle column.
- Use a big source (the tool page suggests at least 2,000 px on the short edge) so every tile actually reaches 1080 px.
- Post grid tiles in the numbered order (01 first) so the image assembles correctly on your profile.
If you only need one photo to fit a square without losing the edges, that's what the no-crop square maker and the SquareImage homepage are for. If the tiles feel heavy for a website gallery, I also run PixSip, a browser-side image compressor.
Things I noticed in my own tool
- No 1×N "panorama" mode: you need the 3×3 + Padding detour above.
- Tiles are square only, and the page doesn't mention the tall profile grid yet.
- Padding is always white, and there's no reposition control for Cropping.
- The download is nine separate files (your browser may ask once to allow multiple downloads), named for grid order rather than carousel order.
Photo credits: Coibita Island Panorama by Nosferattus and Podersdorf Lighthouse 1 by Dimitry Anikin, both via Wikimedia Commons under CC0 1.0.
Related SquareImage posts: Mixed-shape carousel to 1080 squares (Hashnode) · Keep the whole subject when forcing a photo square (Medium) · Instagram-ready square without cropping faces (DEV)










Top comments (0)