Meme Generator

Stamp classic top and bottom Impact-style captions onto any photo in your browser. Free, no account, no watermark, and no file ever uploaded.

🌐 Español

Drop your files here (.jpg, .jpeg, .png, .webp)

🔒 Private by design: your files are processed locally in your browser and never uploaded to any server.

The Impact look, reduced to two pickers and a number

The format has barely changed since image boards invented it. Heavy uppercase lettering in Impact, white fill with a thick black outline so it survives any background, one line pinned just inside the top edge and another just inside the bottom. Everyone recognizes it, and almost nobody wants to build it by hand in an image editor.

This page draws it with the browser’s own canvas. The photo is decoded, redrawn at its original pixel dimensions, and then the captions are stroked in black and filled in white on top, centered horizontally, with a rounded line join so the outline does not spike at sharp corners. Nothing about the picture itself is resized or cropped, so what comes back is your photo at its original dimensions with lettering added. No logo goes on it either, which is the main practical difference from most free meme sites.

Captioning a batch, step by step

  1. Drop your JPG, JPEG, PNG or WebP files onto the box above, or press Choose files. Several at once is fine, and files with an identical name and size are ignored as duplicates when you add more.
  2. Choose a Top caption. It starts on WHEN YOU FINALLY FIX THE BUG, and No top caption leaves that slot empty.
  3. Choose a Bottom caption. It starts on No bottom caption, so a fresh run gives you a single line at the top until you change it.
  4. Set Caption size (% of image width) if the default of 10 is not right for your image.
  5. Press Meme Generator, the button that repeats the page title, and download each captioned photo from the list that appears.

Every file in the run gets the same pair of captions at the same size. That is the point of the batch mode, and it is also its limit: if you want different text per photo, run them separately.

Caption size is a share of the width, not a point size

Typing a font size in points is useless when one input is a 640 pixel screenshot and the next is a 4000 pixel camera file. So the Caption size (% of image width) field takes a number between 1 and 20 and multiplies it by the image’s own width.

Work an example through. A 1200 pixel wide photo at the default 10 gives a 120 pixel font. The margin between the text and the edge is a quarter of the font size, so 30 pixels. The outline is a tenth of it, so 12 pixels. Push the same photo to 20 and the font doubles to 240 pixels, with a 60 pixel margin and a 24 pixel outline to match.

Two floors stop the math collapsing on small images. The font never drops below 10 pixels and the margin never drops below 6, so a 600 pixel image at a setting of 1 still gets legible 10 pixel text rather than a 6 pixel smear. Anything outside the 1 to 20 range, or a non-numeric value, falls back to 10.

Where the captions land, and what that means for framing

The top caption is drawn from its top edge downward at the margin, and the bottom caption from its bottom edge upward at the margin. Both are locked to the horizontal center. There is no position control, because the whole visual joke of the format depends on those two anchor points.

That does mean framing matters. If your subject’s face is at the very top of the shot, the top caption will sit across it. Crop before you caption rather than after: Crop Images offers fixed aspect ratios and starts on a 1 to 1 square, and cropping first also changes the width the caption size is measured against, so the lettering scales to the new frame instead of the old one. If the source is enormous, Resize Images can bring it down first, which keeps the finished meme a sensible size for a chat app.

What the re-encode does to your file

The output format is decided purely by the extension you uploaded. A .png comes back as a PNG, a .webp as a WebP, and anything else, meaning .jpg and .jpeg, as a JPEG. The file name gets -meme appended before the extension, so reaction.jpg becomes reaction-meme.jpg.

There is no quality slider on this page, so the encoder runs at the browser’s default. For PNG that costs nothing, since PNG is lossless. For JPEG and WebP it means a second generation of lossy compression over the entire image, including regions the captions never touched. If the result is larger than you want for a chat app, Compress Images has a Quality (1–100, lower = smaller file) field that defaults to 75, and when no downscale was actually applied and the re-encode came out no smaller, it hands your original bytes straight back rather than returning something bigger than it started with. Related trick, if you want a discreet corner mark rather than a joke across the frame: Add Watermark to Photos takes the same four file types and defaults to a small mark at 5 percent of the width in the bottom right with adjustable opacity, where this tool always draws at full opacity.

Limits worth knowing before you start a big run

Decoding happens one frame at a time, so an animated WebP contributes only its first frame to the output. The captions become ordinary pixels the moment they are drawn, which means there is no way to peel them off later; keep the original if you might want a clean copy.

The batch loop is all or nothing. It has no per-file error handling, so a corrupt or undecodable image ends the whole run and nothing at all is downloadable, not even the files processed before it. Cancelling mid-run behaves the same way, because the shared shell’s cancel button also clears the dropzone and discards anything finished so far. Neither is a data risk, since nothing left the machine, but it does mean very large batches are best split into smaller ones. For more on the rest of the toolkit, see the image tools hub or the roundup in the best image converter and editing tools.

See it in action

Screenshot of the Meme Generator tool with sysfenix-sample.png (466 KB) loaded, Top caption set to WHEN YOU FINALLY FIX THE BUG, Bottom caption set to No bottom caption
Meme Generator mid-process: sysfenix-sample.png (466 KB) loaded, Top caption set to WHEN YOU FINALLY FIX THE BUG, Bottom caption set to No bottom caption.
Screenshot of the Meme Generator result screen showing sysfenix-sample-meme.png ready to download (429 KB, 8% smaller)
The finished result: sysfenix-sample-meme.png ready to download (429 KB, 8% smaller). The download link is a local blob URL — the file never leaves your device.

Frequently asked questions

Why can I only pick captions from a list instead of typing my own?

The option format behind every tool page here supports dropdowns, numbers and checkboxes, and has no free-text field a file-based tool could use. Rather than ship nothing, the classic top-and-bottom meme layout is offered as two independent preset pickers, one per slot, with ten choices each including a no-caption option. It is a real constraint of the page format rather than a paywall, and it is the same compromise the watermark tools on this site made for their text.

How big will the caption actually be on my photo?

The size you choose is a percentage of the image's own width, not a point size, so the same setting looks consistent across a phone screenshot and a camera JPEG. At the default of 10 on a 1200 pixel wide photo the font comes out at 120 pixels, sitting 30 pixels in from the edge with a 12 pixel black outline. There is a floor of 10 pixels, so on a very small image a very low percentage will not shrink the text into nothing.

Does a long caption wrap onto a second line?

No. Each caption is drawn as one centered line, with no wrapping and no automatic shrink-to-fit. The longest preset combined with a high size setting can therefore run past the left and right edges of a narrow image. If that happens, drop the size setting a few points and run the photo again.

Are the letters forced to uppercase?

Yes, unconditionally. The drawing routine uppercases and trims both captions before it touches the canvas, and every preset is already written that way. Bold uppercase in the Impact family with a heavy black outline is what makes the format instantly recognizable, so there is no mixed-case option to switch to.

Will my JPEG lose quality even in the parts I did not caption?

Some, yes, and it is worth being straight about it. The photo is decoded, redrawn onto a canvas and encoded again, so a JPEG in becomes a freshly compressed JPEG out across the whole frame, not just where the text landed. The extension you uploaded decides the output format, so a PNG comes back as a PNG and stays lossless, while JPEG and WebP go through a fresh lossy encode at the browser's own default quality.

One photo in my batch failed. Do I still get the others?

No. The batch loop has no per-file error handling, so a file the browser cannot decode aborts the entire run and nothing is offered for download, including the photos that had already been captioned. The shell shows one generic failure message rather than naming the file. If a batch fails, remove the suspect image, reload the page and try the rest.

Related tools