AI Humanize Image

Picture AI humanizer — what it changes in a picture, parameter by parameter

Most pages about picture humanizers describe the idea. This one lists the mechanics: which byte segments leave the file, how the grain slider converts to noise amplitude in 0–255 levels, and where the hard limits sit. Every number below is read from this tool's own source constants, so you can check the behaviour instead of trusting a screenshot.

What a humanizer can and cannot change in a picture file

An image file on disk is two things stacked together: a container of metadata segments, and compressed pixel data. Those two layers fail differently. Metadata can be removed surgically — the byte ranges are skipped and everything else is copied unchanged. Pixels cannot be removed; they can only be replaced with different pixels, which is what the noise and re-compression stages do.

That split is the honest way to describe a picture humanizer. Stripping is reversible in principle (keep the original file) and exact: the removed bytes are gone and their absence is verifiable. Adding grain is irreversible by nature and approximate: it changes every pixel slightly, and no record of the original remains in the output. So the tool does two different jobs with two different guarantees, and this page keeps them separate.

The four stages, in the order the code runs them

The pipeline is fixed — a stage cannot be skipped, and each one sees the output of the last. That ordering matters for one specific reason: metadata is stripped before the pixels are re-encoded, and the encoded output is stripped a second time, so a browser encoder that writes its own segments cannot put metadata back.

StageWhat happensReversible?
1 · decodingFormat sniffed from magic bytes, EXIF orientation read, bitmap decoded with orientation baking turned off so the browser cannot rotate twice.n/a — read only
2 · strippingEvery JPEG APP0–APP15 segment and COM block is removed; for PNG, only a 14-chunk whitelist survives (IHDR, PLTE, IDAT, IEND, tRNS, gAMA, cHRM, sRGB, bKGD, pHYs, sBIT, acTL, fcTL, fdAT).Exact, verifiable removal
3 · renderingOrientation baked into pixels, 16 MP clamp applied, sensor noise added per pixel, film grain overlaid at 5–17 % alpha in overlay blend mode.No — every pixel shifts
4 · encodingRe-encoded at the chosen JPEG quality, then stripped a second time so nothing the encoder wrote survives into the download.No — re-compression is lossy

Which metadata segments actually leave a JPEG

The stripper walks the JPEG marker chain from the start of the file until it reaches the compressed image data, and drops anything in the APPn range or a comment block. It keeps the segments a decoder needs: SOI, the frame header, quantisation tables, Huffman tables, the scan header and the compressed scan itself.

Removed

  • APP0 — JFIF
  • APP1 — EXIF / XMP
  • APP2 — ICC profile
  • APP3–APP10 — vendor metadata
  • APP11 — JUMBF / C2PA
  • APP12–APP15 — vendor metadata
  • COM — free-text comment

Kept

  • SOI / EOI — file boundaries
  • SOF — frame dimensions
  • DQT — quantisation tables
  • DHT — Huffman tables
  • SOS + scan data — the picture itself

One consequence worth stating plainly: the ICC colour profile lives in APP2, so a colour-managed photograph in a wide-gamut space (Display P3, Adobe RGB) loses that profile when stripped this way. If colour accuracy matters more than metadata removal for a given file, convert to sRGB before processing rather than after.

The grain slider, converted to actual pixel values

“Grain intensity” is a number between 0 and 100 on a slider, which tells you nothing about what happens to the pixels. The tool converts it to an amplitude in 0–255 channel levels, weighted by local brightness so shadows receive more noise than highlights — the physical behaviour of a real sensor, where read noise is a larger fraction of a small signal.

Slider valueNoise in shadows (luma 0)Noise in highlights (luma 1)Grain overlay alpha
0000 (pass skipped)
35 (default)±4.2 levels±1.26 levels0.092
70±8.4 levels±2.52 levels0.134
100±12.0 levels±3.6 levels0.170

The grain is a separate component, not the same noise counted twice. A grey-noise tile roughly half the image width (clamped to 64–512 px) is generated, scaled up to the frame, and composited in overlay mode at the alpha in the last column. The cap at 0.17 is deliberate: past that point the overlay starts flattening real detail instead of adding texture. Channel values are written through a clamped 8-bit buffer, so bright pixels cannot roll over into black.

Parameter reference — every control and its real range

ControlRange / defaultObservable effectSource constant
Grain & sensor noise slider0 – 100, step 1, default 35Sets noise amplitude. At 0 the pixel pass is skipped entirely, so only metadata stripping and re-compression happen.components/HumanizeTool.tsx (min/max/step) · lib/image/types.ts DEFAULT_SETTINGS
JPEG quality slider50 – 100, step 1, default 92Passed to the browser encoder as quality/100. Disabled and ignored when the input is PNG — PNG output stays lossless.components/HumanizeTool.tsx · lib/image/humanize.ts clamp(settings.quality, 50, 100)
File size ceiling60 MBRejected above the limit with a too-large error before any decoding happens.lib/image/format.ts MAX_FILE_BYTES = 60 * 1024 * 1024
Pixel ceiling16,000,000 pxImages above 16 MP are scaled down by sqrt(16e6 / pixels) before effects are applied. A 24 MP 6000×4000 file becomes 4898×3265; a 19.96 MP 5472×3648 file becomes 4898×3265.lib/image/humanize.ts MAX_PIXELS = 16_000_000 · renderCanvas()
Accepted input formatsJPEG, PNGFormat is detected from magic bytes, not from the file extension or the browser-reported MIME type. WebP, GIF, AVIF and HEIC are recognised and refused with an unsupported-format error.lib/image/format.ts SUPPORTED_FORMATS · sniffFormat()
DeterminismSame input + same settings = same outputThe noise seed is derived from input byte length and the intensity value, using a seeded PRNG, so a repeated run reproduces the same grain instead of a new random pattern.lib/image/noise.ts deriveSeed() · mulberry32()

Why the output never claims to be a camera file

A file that has just had its EXIF block removed looks, to a metadata reader, like a file with no camera information — which is also what an exported screenshot or a platform-recompressed upload looks like. The tool does not write a camera make, a lens model, a capture timestamp or GPS coordinates into that gap. Doing so would be forging provenance, which is a different product and one this site does not build.

The same restraint applies to detector claims. Detectors weigh frequency statistics, watermark records, provenance boxes and metadata together, and they are retrained on new data continuously. What is true here is narrower and checkable: the identified metadata segments are gone, the output is re-encoded at the quality you chose, and the pixel statistics differ from the input in the shadows by the amounts in the table above. Anything beyond that would be a guess.

Where the processing happens

All four stages run in the browser tab using the Canvas API. The file is read from disk into memory, decoded, transformed and re-encoded there, and the download is assembled from bytes that never left the machine. There is no upload endpoint in the codebase, so the tool also works with the network disabled. That is why a 60 MB ceiling exists at all: the whole file has to fit in the tab's memory alongside its decoded bitmap, and a decoded bitmap is uncompressed — a 16 MP frame occupies roughly 64 MB of memory on its own, several times the size of the JPEG it came from.

Try the humanizerSee every metadata field in a picture firstStrip metadata without touching pixelsRemove C2PA Content CredentialsCheck what a picture's metadata revealsCheck pixel dimensions before processing

Frequently asked questions

What does a picture AI humanizer actually change in the file?

Two separate things, with two different guarantees. First, metadata segments are removed exactly: for a JPEG that means every APP0–APP15 block (EXIF, XMP, ICC profile, JUMBF/C2PA and vendor blocks) plus the COM comment segment, while the frame header, quantisation tables, Huffman tables and compressed scan data are copied unchanged. For a PNG only a 14-chunk whitelist survives. Second, the pixels are altered approximately: per-pixel sensor noise plus a film-grain overlay, then a re-encode at the JPEG quality you choose. The first change is verifiable byte-for-byte; the second is irreversible and cannot be measured back to the original.

Does it add fake camera EXIF data to make a picture look like a real photo?

No. The tool removes metadata and never writes any, so a stripped file contains no camera make, no lens model, no capture timestamp and no GPS coordinates. That is a deliberate limit: writing invented provenance into a file would be forgery, not editing. What you get instead is a file whose metadata looks like any other stripped or platform-recompressed upload — nothing more.

What are the exact limits on a picture I can process?

JPEG or PNG only, detected from the file's magic bytes rather than its extension or reported MIME type — WebP, GIF, AVIF and HEIC are recognised and refused. Maximum file size is 60 MB. Maximum processed area is 16,000,000 pixels: anything larger is scaled down by the square root of the ratio, so a 24 MP 6000×4000 file comes out at 4898×3265 and a 19.96 MP 5472×3648 file also lands at 4898×3265. Nothing is cropped.

How does the grain slider translate into visible noise?

The 0–100 slider becomes a noise amplitude in 0–255 channel levels, weighted by luminance so shadows get roughly three times the amplitude of highlights. At the default 35 the shadow amplitude is about ±4.2 levels and highlights about ±1.26; at 100 it is ±12.0 and ±3.6. The film-grain overlay runs separately at an alpha of 0.05 plus 0.12 times the slider fraction, capped at 0.17 so it stops adding texture before it starts flattening detail. At 0 the pixel pass is skipped entirely and only metadata stripping plus re-compression happen.

Does re-running the humanizer on the same picture produce a different result each time?

No, and that is by design. The noise seed is derived from the input's byte length and the intensity value, fed into a seeded 32-bit PRNG, so the same input with the same settings reproduces the same grain pattern exactly. Change either the file or the slider and the seed changes, which is why the pattern looks different after a settings tweak but identical when you repeat a run to compare.

Are my pictures uploaded anywhere when I use it?

No. All four stages — decoding, metadata stripping, rendering and re-encoding — run inside the browser tab using the Canvas API, and the download is assembled from bytes already in memory. There is no upload endpoint in the code, so the tool keeps working with the network disconnected. The 60 MB ceiling exists because the entire file has to fit in tab memory next to its decoded bitmap: a 16 MP frame costs roughly 64 MB uncompressed before any effects are applied.