Batch color fixer

Correct white balance, stretch flat histograms and adjust brightness, contrast, saturation and gamma across a whole batch, with per-image overrides for the odd ones out. Everything runs on your device, and nothing is uploaded.

No image selected
โฌ†
๐Ÿ–ผ๏ธ 0

๐ŸŽš Individual Adjustments

Off
Global
On

๐Ÿ”ง Global Adjustments

๐ŸŽจ
๐Ÿ“‚ Drop images here or click to select

Quick start

The preview at the top shows the selected image at full resolution with every adjustment applied. The dock fixed to the bottom of the window holds the thumbnail strip and the control tabs.

  1. Drop images on the strip at the bottom, or click ๐Ÿ“‚ Drop images here or click to select. The first image opens in the preview. Files whose name is already in the batch are skipped.
  2. Click the ๐ŸŽจ tab at the right end of the dock to open ๐Ÿ”ง Global Adjustments. Changes here apply to every image.
  3. Click thumbnails, or press the left and right arrow keys, to check other images. To change one image only, click the ๐Ÿ–ผ๏ธ tab next to ๐ŸŽจ to open ๐ŸŽš Individual Adjustments.
  4. Click ๐Ÿ“ฆ Download, next to the image counter, to get every corrected image in one ZIP.

The โฌ† tab expands the strip into a half-screen grid. ๐Ÿ—‘๏ธ Clear Images empties the batch. Each slider and each panel has its own ๐Ÿ”„ reset button.

What each control does

Each channel runs from 0 (none) to 255 (full).

ControlRange (default)What it does to each pixel
Brightnessโˆ’100 to 100 (0)Adds the value to red, green and blue. +20 lifts every channel by 20, so black becomes dark gray.
Contrastโˆ’100 to 100 (0)Multiplies every channel by 1 + value/100, so +20 means ร—1.2. The scale is anchored at black: shadows barely move, highlights brighten, and โˆ’100 gives a black image.
Saturation0 to 200 (100)Moves each pixel toward or away from its own gray level (0.30 R + 0.59 G + 0.11 B). 0 is grayscale; 200 doubles the distance from gray.
Gamma0.1 to 3 (1)Raises each channel to the power 1/gamma. Above 1 lifts midtones (gamma 2 turns 25% gray into 50%), below 1 darkens them, and black and white stay put.
White Balancemenu (None)Multiplies red, green and blue by three separate gains.
Normalize Histogramon / off (off)Stretches each channel so its darkest value becomes 0 and its brightest becomes 255.

Most photo editors pivot contrast around mid-gray, so ImgTagger's contrast acts more like an exposure boost. For a classic contrast curve, pair it with negative brightness: contrast +20 with brightness โˆ’21 keeps mid-gray at 128 and spreads tones outward in both directions.

White balance modes

  • None: gains of 1.00, no change.
  • Auto: a gray-world correction. It averages red, green and blue over every pixel, then picks gains that make the three averages equal. The global Auto measures the image in the preview when you choose it and applies those gains to every image. To measure again, pick another mode, then Auto.
  • Warm Sunset: red ร—1.15, green ร—1.00, blue ร—0.90. Warms images up, which fixes shots that came out too blue.
  • Cool Daylight: red ร—0.90, green ร—1.00, blue ร—1.15. Cools images down, which fixes orange shots taken under indoor bulbs.
  • Neutral Indoor: red ร—0.95, green ร—1.00, blue ร—1.08. A gentler version of Cool Daylight for the orange cast of warm indoor bulbs.
  • Custom: your own gains in steps of 0.01, from 0.50 to 2.00 globally and 0.10 to 2.00 per image. Global custom gains are kept when you switch modes. Our white balance guide shows how to work them out from a neutral area.

Histogram normalization

For each channel, the tool finds the darkest and brightest value and stretches that range to fill 0โ€“255. A hazy scan whose red runs from 25 to 230 has 25 subtracted from its red and the rest multiplied by about 1.24. Channels stretch separately, so this also shifts color balance and often removes a cast. It uses the absolute extremes, so a single pure black and pure white pixel per channel means no change at all.

The global toggle measures the previewed image when you switch it on and applies that stretch to the batch, clipping pixels in other images that fall outside the range. The per-image On setting measures that image alone.

Order of operations

Each pixel is processed in this order:

  1. Histogram normalization, if on.
  2. White balance gains.
  3. Gamma.
  4. Brightness, then contrast, then clipping to 0โ€“255.
  5. Saturation, then a final clip.

White balance can push a bright channel past 255, but nothing is clipped until after brightness and contrast. If Auto turns highlights blue or cyan, a small negative brightness brings those values back into range before they are cut off.

Global and per-image settings together

Every image follows the global panel unless you override it:

  • Brightness and contrast add. Global +10 and per-image +15 gives +25.
  • Saturation and gamma multiply. Global saturation 120 with per-image 150 gives 180. Global gamma 1.2 with per-image 1.5 gives 1.8.
  • White balance replaces. The per-image menu starts at Global. Any other choice, including None, overrides the global mode for that image.
  • Histogram normalization has three per-image states: Off, Global (follow the global toggle) and On (use this image's own range).

Global settings, including custom gains, are saved in your browser for your next visit. Per-image settings live only in memory and are lost when you reload or clear. Custom gains and the preset modes come back as you left them. Global Auto and Normalize Histogram reset to off, because they were measured on an image from the previous session: switch them back on while previewing an image from the new batch.

A batch shot under one light

One session usually means one cast, so one correction can fix them all. Preview an image with varied content, not a close-up of one colored object, and choose Auto or the matching preset in ๐ŸŽจ. Scan the thumbnails, then fine-tune exposure with gamma. If Auto overshoots, use Custom with gentler gains in the same direction.

Rescue a few odd images

Leave the global panel at its defaults and fix outliers one at a time in ๐Ÿ–ผ๏ธ. Presets or custom gains handle casts, Normalize Histogram: On rescues faded scans, and gamma rescues dark shots. Per-image Auto measures each image's own colors, so it adapts to every image you set it on.

Evening out a training set

For images gathered from many sources, avoid one global Auto, because no single correction suits different lighting. Spot the outliers in the โฌ† grid, fix those per image, and keep changes mild. Do this after the duplicate finder, so you correct fewer files, and before the auto tagger, since color affects tags like hair color or greyscale. The dataset workflow guide covers the full sequence.

When not to color-correct

Skip artwork and style datasets, where the palette is the point, and sepia or monochrome images, which per-channel gains would tint. Use Auto with care on scenes dominated by one color, such as a forest or a sunset, because it pushes them toward the opposite hue. And if an image already looks right, leave it out of the batch: every export re-encodes it. The white balance and histogram guide explains each of these cases.

Export details

๐Ÿ“ฆ Download builds images.zip with every image in the batch. Each is redrawn at its full original resolution with its global and per-image settings applied, then saved:

  • JPEG stays JPEG, with a .jpeg extension: photo.jpg becomes photo.jpeg.
  • WebP stays WebP.
  • Everything else, including PNG, GIF and BMP, becomes PNG. Animated GIFs keep only their first frame.

JPEG and WebP use your browser's default quality, because the tool doesn't set one. Base filenames are kept, so caption .txt files still match. Because images are re-encoded from a canvas, EXIF data such as camera details and GPS location is dropped. Transparency in PNG and WebP is kept.

Privacy

The color fixer uses no AI model and no server. Your browser reads the images from disk, and every adjustment is calculated inside the tab. Your images are never uploaded. See how in-browser processing keeps files private and our privacy policy.

Frequently asked questions

Can I export only some of the images?

Not directly, because Download always includes the whole batch. Load only the images you want to change, or delete extras from the ZIP afterwards. That also stops untouched images from being re-encoded for nothing.

Does it resize or crop my images?

No. Exported files keep their original pixel dimensions and framing. Only the thumbnails in the dock are scaled down.

Why is the preview slow on big photos?

Every change recalculates every pixel of the full-resolution image in JavaScript, which means 24 million pixels per update for a 24-megapixel photo. If you need smaller images anyway, resize first and correct the smaller copies.