Colorizing a photograph used to mean hours in an image editor with a graphics tablet, or handing a family scan to a paid service. A neural network trained on millions of photographs does the same guessing in one pass, and the interesting part of this particular build is that the guessing happens on your machine rather than someone’s GPU cluster.
DDColor, and the 113 MB file your tab downloads once
The model is DDColor, from an ICCV 2023 paper out of Alibaba’s DAMO Academy,
released under Apache-2.0. What runs here is a half-precision ONNX export of
roughly 113 MB, pulled from Hugging Face and executed by onnxruntime-web
through its WebAssembly backend.
That size is the honest cost of the approach. This site never sets the COOP and COEP headers that WebAssembly needs for multi-threading, because those headers break the ad iframes that pay for the place, so the runtime falls back to a single thread and clamps its worker count to one. The upside is that the photo itself makes no journey at all: the only network traffic is the weights and the runtime binaries coming to you.
Loading a scan and getting a colorized PNG back
- Drop your JPG, PNG or WebP scans on the box or press Choose files. More than one is accepted.
- Press AI Photo Colorizer. On the first run in a tab the progress bar sits for a while around the early stages while the model is fetched and the inference session is created.
- Wait for the run to finish. The bar advances through reading the full resolution lightness channel, building the model input, running the network, stretching the color back up, and reassembling the picture.
- Download the result. Output is always PNG, named after the original with
-colorizedappended, sograndad.jpgbecomesgrandad-colorized.png.
PNG is used because the model’s own output should not be immediately degraded by a lossy re-encode. That does mean a big scan produces a big file.
Color is inferred at 256 by 256, detail comes from your own pixels
The ONNX graph has a fixed, non-dynamic input shape of 256 by 256. Your photo is drawn down to that size for the network and nothing larger ever reaches it, so the inference cost does not grow with your photo’s resolution at all. What does grow with resolution is everything around it: the per-pixel color space conversion of the full-size image, the upsampling of the predicted color field, and the final reassembly, all of which run on your CPU.
The output is a color field at that same small size, which is then bilinearly resized back up to the photo’s real dimensions. Lightness is taken directly from your original file at full resolution and never passes through the model. That split is why the result stays as sharp as your scan while its color stays smooth, and it is also why a thin object can pick up a little color from its neighbor.
Only two of Lab’s three channels are ever guessed
The whole pipeline works in CIE Lab rather than RGB. Your photo is converted to Lab, its lightness kept and its two color channels zeroed, and that achromatic version is handed to the network as a three-channel input. The model returns only the two color channels, which are recombined with your untouched lightness and converted back to sRGB.
Zeroing both color channels yields a pixel whose red, green and blue are equal, a direct consequence of how the D65 white point is defined, and the code then takes that one shared byte and writes it into all three input planes. The model therefore receives a genuinely neutral gray regardless of what tint a sepia print or a yellowed scan arrived with.
The 3000 pixel ceiling, and the message you actually get
Anything longer than 3000 pixels on its longest side is rejected before any inference happens. The engine raises a specific, helpful message about that limit, but the file shell that wraps every conversion on this site catches every error and replaces it with one generic sentence, so what you will read is only that something went wrong. If a colorize run fails on a large scan, the dimensions are the first thing to check. Halve it with Resize Images, whose default setting is exactly a 50% reduction, then colorize the smaller copy.
Shrinking the finished PNG is less straightforward than it sounds. The image compressor keeps a PNG as a PNG, and the canvas PNG encoder is lossless and ignores the quality number entirely, so only that tool’s downscaling option will meaningfully change the size; if the re-encode does not come out smaller and you did not downscale, it hands your original file straight back to you.
What a statistical guess cannot recover
A colorizer infers what colors are plausible for the shapes and tones in front of it. Skin, sky, foliage and wood are learned strongly enough to look right most of the time. A specific car’s paint, a printed logo, a dyed dress: the information was never recorded, and the model has no way to know. Treat the result as a strong first draft for a keepsake or a family history project, not as a restoration of fact.
It also does nothing about damage. Scratches, dust, tears and fading all come through unchanged, because only color is added. If the goal is a print, an upscaling pass afterwards may help with a low resolution scan, and the wider image tools hub covers the cropping and cleanup around it. Going the other way, the black and white converter is the tool for deliberately removing color rather than inventing it.