pngtoolskit.org
PNG and image utilities, in the browser
Say hi →

Tone Curves

draggable curve over the histogram · RGB + per-channel · split preview · batch

The curve is the one control that can do what brightness, contrast, levels and gamma sliders each do separately — and several of them at once. Drag a point up and those tones get brighter; steepen a section and the contrast in that part of the range increases; bend one channel on its own and you have colour grading. The histogram sits behind the grid so you can see which tones you are actually moving, and the preview updates as you drag.

Drop an image here

PNG, JPG, WebP — multiple files allowed, the first one drives the preview

    Click to add a point · drag to move · Alt-click or double-click to remove · arrow keys nudge

    2 points on RGB · curve is linear

    no files
    Ready.

    How to use it

    1. Drop one or more images. The first one is loaded into the preview and its histogram is drawn behind the grid.
    2. Leave the channel on RGB for tonal work — brightness, contrast, black and white points.
    3. Click anywhere on the diagonal to drop a control point, then drag it. Up brightens, down darkens. The x position picks which tones you are moving: left is shadows, middle is midtones, right is highlights.
    4. Switch to Red, Green or Blue to grade colour. Lifting the blue shadows and pulling down the blue highlights is the classic teal-and-orange look.
    5. Uncheck Split preview to see the whole graded frame, then press Apply curve & download. Every queued file gets the same curve at full resolution.

    Reading the grid

    The horizontal axis is the input value of a pixel, 0 on the left to 255 on the right. The vertical axis is what that value becomes. The dashed diagonal is the identity: a curve sitting exactly on it changes nothing. Everything you can do reduces to three moves.

    Steepening one region always flattens another, because the total vertical distance is fixed at 255. That trade is the whole craft of curves: decide which tones matter in this picture, and spend the contrast there.

    Why the interpolation is monotone

    Between your control points the curve has to be filled in, and the obvious choice — an ordinary cubic spline — misbehaves. Put two points close together with a steep slope between them and the spline overshoots: it climbs past 255 just after the second point and then comes back down. In an image that reads as a bright rim or a dark seam appearing out of nowhere in a smooth gradient.

    This grid uses a Fritsch–Carlson monotone cubic instead. It clamps each segment's tangents so the interpolated curve never rises where your points fall or vice versa, and never leaves the range your points define. The cost is that very tight point clusters look a little stiffer than a free spline. That is the right trade for a tool whose output is pixels.

    FAQ

    What order are the channels applied in?

    Master first, then the per-channel curve — the same as stacking two adjustment layers with RGB underneath. Internally that is one composite lookup table per channel, red[master[v]], so a pixel is still touched exactly once no matter how many curves you have bent.

    Does it work on transparent PNGs?

    Yes. Alpha is passed through untouched, and fully transparent pixels are skipped entirely — grading them would produce coloured fringes wherever the image is later composited. Semi-transparent pixels are graded normally.

    Why does the preview look different from the download?

    It should not, tonally. The preview is a downscaled copy — at most 460 pixels on the long edge — so that dragging stays smooth, and the export runs the same lookup tables over the full-resolution image. Fine grain and dithering will look softer in the small preview simply because of the downscale.

    Can I undo one point without resetting everything?

    Alt-click the point, or double-click it. That removes it and the curve re-interpolates through what is left. The two endpoints cannot be deleted — they define the domain — but they can be dragged vertically. Reset curves returns all four channels to linear.

    How is this different from the other tone tools here?

    Auto levels picks the black and white points for you from the histogram. Brightness, contrast and gamma each apply one fixed shape. Apply a .cube LUT loads a grade someone else authored. Curves is the manual version of all of them, and the only one that lets you shape different parts of the range independently.