Skip to main content
PE

Photo Editor

Adjust brightness, contrast, saturation, grayscale, sepia and blur on your photo with live sliders, then download the result — all in your browser.

Did you like the tool? Thanks!
Share:

More Image Tools Tools

IC

Image Cropper

Crop any image to exactly the area you need, with a live preview — nothing is uploaded, everything happens in your browser.

IR

Image Resizer

Resize any image to an exact width and height in your browser — optional aspect-ratio lock, PNG/JPEG/WebP output, nothing uploaded.

IC

Image Compressor

Shrink an image's file size by re-encoding it at a chosen quality level — live before/after size comparison, JPEG/WebP/PNG output, done locally.

IF

Image Flip & Rotate

Flip an image horizontally or vertically and rotate it by any angle — quick 90/180/270° buttons or a free-angle slider, corners never clipped.

IT

Image to Base64

Convert an image into a Base64-encoded string — full data URI or raw Base64, character count, one-click copy, all done locally.

BT

Base64 to Image

Paste a Base64 string or data URI and preview the decoded image instantly — auto-trims whitespace, lets you pick the assumed format, download in one click.

PI

Placeholder Image Generator

Generate a simple placeholder image for wireframes and mockups — custom size, colors and text, auto-sized to fit, PNG/JPEG/WebP output.

IF

Image Format Converter

Convert an image between PNG, JPEG, WebP and BMP entirely in your browser — no upload, instant preview, adjustable quality.

FG

Favicon Generator

Turn any image into a complete favicon package — six PNG sizes plus a combined multi-resolution .ico file, generated locally in your browser.

AA

ASCII Art Generator

Turn a photo into text-based ASCII art, or type a short message as a large block-letter banner — both rendered entirely in your browser.

Every adjustment redraws from the original image, so effects never compound. Everything processes locally in your browser — nothing is uploaded.

Brightness/Contrast/Saturation are centered at 100% (no change), ranging 0-200%. Grayscale/Sepia/Blur start at 0 (no effect).

How to Use Photo Editor

Upload a photo, then drag any of the six sliders — Brightness, Contrast, Saturation, Grayscale, Sepia and Blur — to see the effect applied instantly. Brightness, Contrast and Saturation are centered at 100% (no change), while Grayscale, Sepia and Blur start at 0 (no effect), so every slider has a clear, labelled neutral position. Reset returns every slider to neutral in one click, and Download saves your edited photo as a PNG.

About Photo Editor

Basic photo adjustment tools have existed in some form since the earliest photo-editing software, and the six adjustments here — brightness, contrast, saturation, grayscale, sepia and blur — cover the core set that accounts for the overwhelming majority of quick, everyday photo touch-ups: correcting a photo that's a little too dark or washed out, converting a color photo to black-and-white or a warm vintage sepia tone, or softening an image slightly. What makes this implementation notably simple and robust under the hood is a specific, deliberate technical choice: rather than manually reading and rewriting individual pixel values (the traditional approach, using `getImageData()` to pull out every pixel's red/green/blue numbers, running arithmetic on each one by hand, then writing them back with `putImageData()`), this tool uses the canvas 2D context's built-in `filter` property — the same CSS `filter` syntax used to apply effects like `brightness()`, `contrast()` and `blur()` directly to images and elements in ordinary web pages, applied here to a canvas drawing operation instead. This matters for two concrete reasons. First, correctness: the browser's own, heavily-optimized, spec-compliant filter implementation handles all six effects — including the trickier ones like blur, which genuinely requires sampling and averaging many neighboring pixels together, not just adjusting one pixel's own numbers — in a way that's guaranteed to match how the same `filter` values would render anywhere else in a browser, rather than trusting a hand-written pixel loop to reimplement that math correctly (getting brightness/contrast/saturation formulas subtly wrong, or writing a slow, naive blur, are both easy mistakes when rolling this by hand). Second, performance: filters are applied by the browser's own rendering engine in one pass at draw time rather than in a JavaScript loop iterating over every pixel individually, which stays fast even on a large photo where a hand-rolled per-pixel loop would visibly lag as you drag a slider. The other detail that matters more than it might first appear: every single slider change redraws completely fresh from the *original*, untouched image you uploaded — never from whatever the canvas currently shows. This sounds like a minor implementation detail, but it's the difference between a photo editor that works correctly and one with a subtle, compounding bug: if you instead re-applied each new filter on top of an *already-filtered* canvas, adjustments would stack unpredictably — dragging Brightness back down to 100% after having previously nudged it up wouldn't actually undo anything, because the earlier brightened pixels would already be permanently baked into the canvas by the time the next filter was applied on top of them. Keeping the original image in memory and redrawing from scratch every time means every slider always represents an absolute setting relative to the untouched source image, exactly matching what the slider's number actually says, no matter what order you moved the sliders in or how many times you've adjusted them.

Details & Tips

How the combined filter is built: all six current slider values are assembled into one single CSS filter string in a fixed order — `brightness(N%) contrast(N%) saturate(N%) grayscale(N%) sepia(N%) blur(Npx)` — and applied to the canvas context in one assignment (`ctx.filter = combinedString`) immediately before a single `ctx.drawImage()` call that redraws the entire original image. Because all six effects are expressed in one filter string applied at once, the browser composes them together correctly as a single rendering pass, rather than needing this tool to manually figure out the mathematically correct order to layer six separate effects on top of one another. The two adjustment conventions used here are labelled deliberately differently, and consistently, across the two groups of sliders, to avoid the confusion of guessing which direction "more" means for each one: Brightness, Contrast and Saturation are all centered at 100%, meaning "no change from the original", with a working range of 0% (fully diminished — solid black for brightness, flat mid-gray for contrast, fully desaturated for saturation) up to 200% (double the original effect). Grayscale, Sepia and Blur instead start at 0, meaning "no effect at all", ranging up to 100% for Grayscale and Sepia (100% grayscale removes all color; 100% sepia applies the full warm vintage tone) and up to 20 pixels of blur radius, which is a strong, clearly visible softening at typical photo display sizes without needing to scroll past a range no one would realistically use. Reset sets every slider back to its documented neutral value in one click — 100% for Brightness/Contrast/Saturation, 0 for Grayscale/Sepia/Blur — and immediately redraws, so you can always get back to the untouched original look without re-uploading the photo. Download works by calling the canvas's own `toBlob()` method with a PNG type, which captures the canvas exactly as currently rendered (filters and all) and triggers a browser download — since the filter was already applied at draw time rather than being some kind of live, undoable CSS effect sitting on top of a canvas element, whatever you see on screen at the moment you click Download is exactly the pixel data that gets saved into the file. Worked example tracing the "never compound" behaviour directly: set Brightness to 150%, see the photo lighten. Now drag Brightness back down to 100% — the photo returns to looking exactly like the original untouched upload, with zero residual brightening, because that slider change triggered a fresh redraw straight from the original image using a filter string built fresh from all six *current* slider values (Brightness now back at 100%, meaning "apply no brightness change") — not a second brightening pass layered visually on top of the already-brightened result sitting on the canvas from the previous adjustment. This is true no matter how many times you've moved any slider back and forth: every single change is computed relative to the untouched original, never relative to whatever the canvas happened to show a moment ago.

Frequently Asked Questions

Do adjustments stack or compound if I move a slider back and forth?
No — every slider change redraws completely fresh from the original, untouched uploaded image, using a filter string built from all six current slider values. Nothing is ever layered on top of an already-filtered canvas, so a slider always represents an absolute setting, not a cumulative one.
What do the Brightness, Contrast and Saturation ranges mean?
They're centered at 100%, meaning "no change from the original". The range runs from 0% (fully diminished) to 200% (double the original effect), so 100% is always the neutral starting point for these three.
What do the Grayscale, Sepia and Blur ranges mean?
They start at 0, meaning "no effect at all". Grayscale and Sepia go up to 100% intensity (a full effect), and Blur goes up to 20 pixels of blur radius, a strong, clearly visible softening.
How are the filters actually applied — pixel by pixel?
No. This tool uses the canvas 2D context's built-in "filter" property (the same technology as CSS filters like brightness() and blur()) rather than manually reading and rewriting individual pixel values, which is simpler, faster, and matches the browser's own correct, optimized filter implementation.
Can I combine multiple adjustments at once, like sepia and blur together?
Yes — all six sliders combine into one single filter string applied in one drawing pass, so you can freely mix, for example, reduced saturation with added sepia and a touch of blur, and see the combined result update live.
What does Reset actually do?
It sets every slider back to its documented neutral value (100% for Brightness/Contrast/Saturation, 0 for Grayscale/Sepia/Blur) and immediately redraws, returning you to the untouched original look without needing to re-upload the photo.
What file format does the download produce?
A PNG image, captured directly from the canvas exactly as displayed at the moment you click Download — whatever adjustments are visible on screen are exactly what gets saved.
Is my photo uploaded to a server for processing?
No. The image is loaded and processed entirely in your browser using the canvas API — it is never transmitted, logged, or stored anywhere outside your own device.
Why is Blur measured in pixels instead of percent like the others?
Blur radius is inherently a distance (how many pixels of neighboring color get blended together), so it's expressed in pixels for a direct, intuitive sense of the effect's strength, rather than forcing it into an arbitrary percentage scale.
Can I crop or resize my photo here too?
No — this tool is scoped specifically to the six color/tone/blur adjustments. For cropping, use the Image Cropper tool; for resizing, use the Image Resizer tool, both elsewhere in this category.
Does this support layers, selective/local adjustments, or curves?
No. This is a focused, core set of six global adjustments applied to the whole image at once — not a full photo-editing application with layers, masks, selective regions or tone curves.

Part of These Collections

Also Available As

photo editor online, image editor, adjust brightness contrast online, sepia filter online, grayscale photo tool, blur image online

Found a Problem?

Let us know if something with Photo Editor isn't working as expected.

Thanks — we'll take a look.