Pixelation · July 28, 2026
How to make a pixelated image clear
How to make a pixelated image clear when the squares are hard nearest-neighbor stairs, not JPEG mush. A meme-file note.

Clear, here, means the blocks stop pretending to be edges. Make the pixelated image clear and reject a repair that invents a window.
The file in the folder is a meme, and the request was how to make a pixelated image clear. I want the diagnosis in the first look, because the usual cure is aimed at a different disease. These squares are hard. A flat patch of background is the same RGB value, repeated, then a step to the next value with no transition. That is nearest-neighbor enlargement. It is not the mush of a heavy JPEG, where an 8 by 8 block wobbles inside itself and rings at the edge. I have run JPEG repairs on staircases and stair repairs on JPEG, and both times the file looked busier and no clearer.
The delivered image was meme-stairs.png, 1600 by 1200, no compression artifacts I could blame on a quantizer. I sampled a patch of wall. Sixteen pixels in a 4 by 4 block were identical, 214, 214, 206. The next block to the right was identical to itself and one step down, 206, 206, 198. Four times four. 1600 divided by 4 is 400. 1200 divided by 4 is 300. The picture that was enlarged, blindly, was 400 by 300. Someone scaled it with the method that copies pixels, then exported a PNG so the copies would stay exact. The exactness is the tell. JPEG would not have preserved sixteen identical values after a save.
TL;DR. Hard identical squares, 4 by 4, mean a 400 by 300 picture was scaled with nearest neighbor to 1600 by 1200. JPEG mush is a different pattern, 8 by 8 and noisy inside the block. I cropped the caption off before any model saw it, because a trial pass changed a three-letter word. A 2× pass on the photo region alone softened the stairs on the cheek and started to invent pores. Bicubic was softer and did not invent. I kept the original caption and the hard white stroke, composited over the repaired photo, and I did not call it the original. Clear, here, means the stairs stop shouting. It does not mean the small file came back.
Sampling the squares so I would believe myself
Fit-to-window made the meme look merely "crunchy," which is the word the client used. At one file pixel per screen pixel the crunch resolved into a grid I could count.
I used a readout, not my eyes, for the identical-value test. Eyes call near-matches exact. The readout on the wall said exact. On the cheek, along a diagonal, the steps were also exact: a run of four pixels, a jump, a run of four, a jump, forming a stair whose tread and riser were both 4 pixels. A diagonal in a nearest-neighbor enlarge is a staircase with equal treads. A diagonal in a JPEG is a wobble with mosquitoes. I have both reference crops on the tool, and this file matched the staircase.
The face in the 1600-wide file is about 280 pixels tall, which means it was about 70 pixels tall in the 400 by 300 source. Seventy pixels of face, copied into squares. The eyes are dark blocks. The mouth is a darker run. There is a white stroke around the figure, also stair-stepped, about 4 pixels wide in the big file, so it was 1 pixel wide in the small file. A 1-pixel stroke, copied, becomes a 4-pixel ribbon of pure white with hard corners. That ribbon is a drawing. It is not a rim light the camera saw.
The caption sits in the lower third, block letters, white with a black halo, also on the 4-pixel grid. I can read it. I will not type it here. The point is that I can read it in the original and I could not trust it after a model. A joke that depends on a word is a worse place to invent letters than a flowchart. The flowchart at least was not trying to be funny.
There is a longer separation of stair types in how to fix pixelated photos. The meme is the pure stair, almost no JPEG, which is rarer than the threads imply. Most "pixelated" uploads I get are both. This one was a PNG on purpose, I think, because the person who enlarged it wanted the blocks to stay crisp for the joke and then changed their mind when they needed it on a slide.
The pass that edited the joke
I broke my own rule and ran the whole 1600 by 1200 through a 2× upscale, caption included, to see the failure at full size. Output 3200 by 2400. The cheek stairs softened. The wall, which had been flat, gained a faint plaster texture. The white stroke gained a gray side and a second, thinner echo. And the caption, a short word I had just read, grew an extra stroke on the last letter and became a different short word. Not a blur. A different word, the kind a tired reader would not flag.
I put that file in rejected-caption-changed and I did not "fix" the letter with a brush. A brushed letter on a generated word is how a third word appears. The original PNG still had the right caption, untouched, because PNG was not the problem. The model was the problem. I cropped the caption and the stroke out of a working copy, a rectangle from y 0 to y 980, leaving the lower band alone, and I never sent that lower band to a model again.
The pixelated photo tool is where I compared the cheek, original squares against the 2×, with the caption already gone. The slider on the cheek is flattering. The slider on a flat wall shows the invented plaster. I needed both. A cheek-only judgment would have shipped the plaster and, if I had been sloppy about the crop, the new word.


The generated sample for this note is the stair version of a simple scene: a smile, a sun, and bars, broken into hard squares, flat inside each square. I show it when someone says pixelated and means "a bit mushy." If the sample's squares match their file, we are in this note. If their blocks are dirty inside, we are in a JPEG note, and the low-quality recompress writeup is the closer cousin. The meme was clean squares. I keep the sample so I do not have to put their joke on a shared screen.
Photo region, stroke, caption, three different objects
The photograph inside the stairs
The figure is a real photograph that was reduced and then copied up. I can tell because the 4 by 4 blocks along the cheek are not a hand-drawn pixel style. The colors change in photographic clusters, skin next to a darker ear, a highlight that occupies two source pixels and therefore eight output pixels. Pixel art does not usually have a sensor's highlight sitting in it. Someone took a photo, made it small, and scaled it with the worst interpolator for photos and the right interpolator for sprites.
On that photo region I tried three things at the scale of the small image, which I reconstructed by sampling every fourth pixel. That reconstruction is exact for a pure nearest-neighbor enlarge. I checked it by expanding my 400 by 300 extract back with nearest neighbor and subtracting it from the 1600 by 1200. The difference was zero in the photo and the stroke. So I had the true small file, recovered, not estimated. That was the best moment of the job. You cannot un-JPEG an exact grid. You can un-nearest-neighbor one, if nobody has resaved it through a blur since. They had not.
From the 400 by 300, bicubic to 800 by 600 made a soft face. The stairs were gone. The mouth was the same mouth, just ramped. No new tooth, no new pore. It looked slightly out of focus, which it is, because a blend is a blur. The client said it looked "old." They meant soft. Soft is what honesty looks like at this scale.
From the 400 by 300, a 2× model pass, also to 800 by 600, made a clearer cheek and a more specific eye. The eye in the source is about 6 pixels wide. In the 2× it is 12, with an iris boundary I cannot point to in the 6. It is a plausible iris. It is not a recorded one. The wall picked up the plaster I had seen in the reckless full-frame pass, milder here. I accepted a light plaster over a hard stair, grudgingly, because the client was going to put this on a slide behind a speaker and the stairs were reading as a broken file rather than as a style. I said, in the email, that the eye detail is proposed. They answered that they knew the person and the eye looked like the person. Knowing the person is not the same as the file containing the eye. I left the sentence in the delivery note anyway.
A 4× from the 400 by 300, to 1600 by 1200, replaced the face with a smoother person. Pores appeared in a regular way. The ear grew a rim. The hair, a dark mass with one lighter streak, became strands that curled differently from the blocky streak in the source. The AI image upscaler will do this cheerfully. Clarity, in the sense of decided edges, went up. Fidelity went down. I did not ship 4×. The slide did not need 1600 pixels of a face that was 70 pixels tall. It needed the stairs to quiet down at the size of a deck, which the 2× already did.
The stroke and the words
The white stroke stayed on the original 4-pixel grid. I did not let the model redraw it. A hard outline is part of the meme's grammar. When the 4× had its way, the outline became a soft rim light with a shadow on the outer side, and the figure popped like a cutout from a different decade. I masked the original stroke and the original caption from the PNG and laid them over the 2× photo. The overlay does not match in sharpness. The face is softer and more photographic. The letters are chunky. That mismatch is correct. They were always different objects. Forcing them to one texture is how the word changed.
I checked the composite at the slide size, 1920 wide, by placing it in the deck and looking from the back of the room, which in my office is the doorway. The stairs no longer glittered. The word was the word I read on day one. The cheek was a little more detailed than the 400-pixel source earns. I can live with that trade because I wrote it down and because the 4×, which I cannot live with, stayed in the reject folder.
A table of block types, so the next file gets sorted first
I keep this table in the pixelation folder. The meme is row two. Most client files are row four, and they want a single checkbox anyway.
| What the sample shows | Likely cause | First move | Do not |
|---|---|---|---|
| Exact repeats, 2 by 2 | nearest neighbor, 2× | Rebuild the small grid by taking every second pixel | Sharpen the stairs into double edges |
| Exact repeats, 4 by 4, hard stairs | nearest neighbor, 4×, this meme | Recover the small grid, separate type from photo | Run the caption through a model |
| Exact repeats, odd sizes, 3 by 3 or 5 by 5 | a non-integer scale or a screen photo | Crop to one repeat and test before a full pass | Assume a clean 2× recovery |
| 8 by 8, values wander inside, ringing | JPEG, possibly after a scale | Treat compression first | Confuse the ring with a real edge |
| Hard stairs plus dirty 8 by 8 | both diseases | Split the work, do not pick one slogan | One more sharpen |
The odd-size row is there because the week after this meme I received a screenshot of a screenshot, repeats of 5, and I wasted a morning trying to extract every fourth pixel. The subtraction against the enlarged extract was not zero. There was no exact small grid to recover. I had to treat it as a photograph of squares, which is a worse problem, and the note for that mess is not this note. Diagnosis is a subtraction, not a vibe.
There is an upscale-specific companion in ai image upscale for when the small grid is real and you are choosing a scale on purpose. The meme's small grid was real. The right scale was 2× on the photo only, not the biggest multiple the menu offered.
What "clear" was allowed to mean
I asked the client what clear meant, because the word is doing too much work. They said they wanted to read the face at the back of a room, and they wanted the caption unchanged, and they did not want it to "look like a painting." The 4× looked like a painting. The bicubic looked like a soft photo, which they called old. The 2× composite was the one they pointed at without joking. Pointing is not a measurement, so I also did the measurement. On the cheek diagonal, the 4-pixel stair became a ramp about 2 output pixels wide in the 2× file, with no second edge. On the caption, the letters were bitwise the original. On the wall, a flat block became a very slight variation, which I showed them at 200 percent and which disappears at slide size.
If clear had meant "recover the camera original," I would have stopped at the recovered 400 by 300 and told them the camera original is gone. The 400 by 300 is itself already a reduction. You can see it in the ear, which is a handful of source pixels. Making that handful clear is a drawing. We agreed, in writing, that the delivery was a slide-sized face without stairs, not a restoration of a larger camera file nobody could find.
The checks I wrote on the reject folder:
- Test one flat block with a readout. Exact repeats mean nearest neighbor. Wandering values mean JPEG.
- If the repeats divide the frame evenly, extract the small grid and confirm by expanding and subtracting.
- Remove captions, logos, and one-pixel strokes from the crop before a model.
- Compare bicubic and a 2× model at the same output size. Ship the model only if the face survives and the flat areas do not grow objects.
- Paste the original words back. Do not retype them from the upscale.
- Reject 4× when hair, ears, or pores appear that the small grid cannot locate.
- Read the caption on the composite forward and backward. A new word is a failed job even if the cheek is pretty.
The backward read is a tic I picked up after the three-letter miss. I read the word from the last letter. It slows me down enough to see an extra stroke.
What I delivered
The deck got a PNG, 1600 by 1200, photo from the 2× model scaled to sit in the original frame, stroke and caption from the untouched PNG. The recovered 400 by 300 sits beside it, named as the source. The rejected full-frame pass with the wrong word sits in a folder the client does not sync, and I kept it locally so I can show the next person the exact failure instead of describing it.
I did not denoise. There was no grain. Denoise on exact flats can invent the plaster even earlier. I did not sharpen the composite. Sharpening the 2× cheek put a halo along the mask boundary where the photo met the original stroke, a bright line that looked like a second outline. The mask edge is a place I have sharpened by habit and regretted. The habit is now in the checklist by omission. Sharpen is not on the list.
The meme is funny at 400 by 300 if you are close to the screen, and it is a smear of stairs at the back of a room. The work was to move it across that gap without editing the joke. Clear, in the only sense I will sign, is a cheek that no longer stair-steps and a word that still matches the file I was handed. The pores I allowed in the 2× are the part I am least proud of. They are noted. If the client reprints this in a huge format later, the note is the warning, and the 400 by 300 is the file they should start from, stairs and all, rather than from my smoother face.
Questions that come up after the file is open
How can I tell nearest-neighbor squares from JPEG blocks?
Sample inside a flat color. Nearest-neighbor repeats the exact same value across a 2 by 2 or 4 by 4 and then steps hard. JPEG blocks are usually 8 by 8 and the values inside them wander, with ringing at the edges.
Will making a pixelated meme clear rewrite the caption?
It will if the caption is in the crop. Letters are shapes with correct answers, and a photo model does not have the joke. Cut the caption out, repair the picture, and paste the original caption back.
Is bicubic enough to clear hard stairs?
Bicubic blends the stairs into a ramp. The ramp is soft and it does not invent a new face. If soft is acceptable, stop there. If you want a decided edge, a 2× model pass is a trial, not a promise.
Should I upscale the white outline with the face?
Not if the outline is a graphic. On this file a 4× pass turned a hard white stroke into a shaded rim. I kept the stroke from the original pixels and let the model see only the photograph.