Meme Generator
Choose an image, type a top and bottom caption, and download the finished meme. Captions are auto-capitalized, centered, and auto-sized to fit — classic white text with a black outline, just like the originals.
Pick a JPG, PNG, or WebP to start captioning — nothing uploads, it opens straight into the editor below.
Caption any image without uploading it anywhere
This tool loads your image into an <img>,
reads its real pixel dimensions from naturalWidth/
naturalHeight, and sizes a <canvas>
to match exactly — so the downloaded meme is the same resolution
as your source photo, never stretched or resampled. Each caption
is drawn with ctx.strokeText() in black before ctx.fillText() in white, which is
what produces the classic thick black outline around white
letters: the stroke is laid down first and the fill sits on top
of it, rather than the other way around.
Worked example
Type "one does not simply" into the top field
and it's drawn as ONE DOES NOT SIMPLY — large,
centered, and comfortably inside the image width, because a
short caption fits at the starting font size on the first try.
Now try something much longer, like
"one does not simply walk into mordor without a lot of
planning and snacks"
. At the same starting size that caption would run off both
edges of the canvas, so the tool measures it with ctx.measureText(), finds it's too wide, and steps
the font size down — re-measuring at each step — until the text
either fits on one line or wraps onto a second or third line at
a size that still reads comfortably. You never see the overflow;
the caption just arrives smaller and possibly split across a
couple of lines instead of spilling off the sides.
Frequently asked questions
Does my image get uploaded anywhere?
No. The file is decoded locally and drawn onto an in-page <canvas> element with the browser's own Canvas API, the captions are rendered directly onto that canvas, and canvas.toBlob() produces the downloadable PNG — all of it on your device. Nothing is ever sent to a server.
Why does my caption automatically turn into ALL CAPS?
That's the classic meme convention: bold, uppercase text in a condensed font like Impact is what makes top/bottom captions instantly readable over a busy image, and it's the look nearly every meme template uses. This tool uppercases both fields automatically so you don't have to hold Caps Lock — type normally and it's converted for you.
Why did my caption's font get smaller than I expected?
Auto-fit. Before drawing, the tool measures your caption with ctx.measureText at a large starting size, and if it's wider than the image (or wraps to more than three lines), it steps the font size down and re-measures until the text comfortably fits the canvas width — or wraps onto a second or third line if it still doesn't fit even at a sensible minimum size. Short captions stay big and bold; long ones shrink automatically instead of spilling off the edges.
What file do I get when I download?
A PNG at the same pixel dimensions as your original image (whatever its natural width and height were), produced by canvas.toBlob(). Because it's a full re-render of the canvas, the captions are baked permanently into the pixels — there's nothing further to edit after download, just like a real meme.