Chrome
A high-performance C++ port of negfix8 for processing scanned color negative film. Inverts and color-corrects 16-bit linear Rec.709 TIFF images from film scanners.
Example
| Input (Scanned Negative) | Output (Processed) | |
![]() |
➜chrome -cs -sat 50 -exp 1.2➜ |
![]() |
Performance
Chrome vs negfix8
| Image | Tool | Flags | Time | Speedup |
|---|---|---|---|---|
| Large (9098×12160, 633MB) | negfix8 | — | 18m 8s | 1x |
| Large (9098×12160, 633MB) | Chrome | — | 1.26s | ~865x |
| Small (4272×6272, 153MB) | negfix8 | — | 22.0s | 1x |
| Small (4272×6272, 153MB) | Chrome | — | 0.41s | ~54x |
Chrome Detailed Benchmarks
Large Image (test_input.tiff — 9098×12160, 633MB)
| Flags | Time |
|---|---|
| (baseline) | 1.26s |
-cs |
1.38s |
-sat 50 |
1.38s |
-exp 1.2 |
1.39s |
-cs -sat 50 -exp 1.2 |
1.45s |
Small Image (test_input_small.tiff — 4272×6272, 153MB)
| Flags | Time |
|---|---|
| (baseline) | 0.41s |
-cs |
0.36s |
-sat 50 |
0.35s |
-exp 1.2 |
0.35s |
-cs -sat 50 -exp 1.2 |
0.36s |
Benchmarks run on AMD Ryzen 9 7950X3D (32 threads, 64GB RAM)
Features
- LUT-based pixel processing with OpenMP parallelization
- Per-channel gamma correction to neutralize orange mask
- Profile save/load for consistent batch processing
- Optional saturation boost, contrast stretching, exposure adjustment, mirror
Building
Dependencies
- CMake 3.x+
- OpenCV (core, imgproc, imgcodecs)
- OpenMP (optional, for parallelization)
Ubuntu/Debian
sudo apt install cmake libopencv-dev
macOS (Homebrew)
brew install cmake opencv libomp
Build
cmake -B build -S .
cmake --build build
The executable is built at build/chrome.
Usage
./build/chrome -i input.tif [-o output.tif] [flags]
Flags
| Flag | Description |
|---|---|
-g <val> |
Set gamma (default 2.15) |
-cs |
Enable contrast stretching |
-exp <N> |
Exposure adjustment in stops (-10 to +10) |
-sat [N] |
Saturation boost, N=0-100 (default 20 if no value) |
-m |
Mirror image horizontally |
-r <N> |
Binning/downscale by factor N |
-c <file> |
Create profile from image and save (exits after) |
-u <file> |
Use existing profile for processing |
Examples
# Basic conversion
./build/chrome -i scan.tiff -o output.tiff
# With adjustments (contrast stretch, 50% saturation boost, +1.2 stops exposure)
./build/chrome -i scan.tiff -o output.tiff -cs -sat 50 -exp 1.2
# Create a profile for batch processing
./build/chrome -i scan.tiff -c myfilm.profile
# Apply saved profile to multiple images
./build/chrome -i scan2.tiff -o output2.tiff -u myfilm.profile
Testing
Test files are located in test_data/:
| File | Description |
|---|---|
test_input.tiff |
Sample 16-bit scanned negative |
test_expected.tiff |
Reference output from original negfix8 |
current_output.tiff |
Chrome output (default settings) |
current_output_adj.tiff |
Chrome output with -cs -sat 50 -exp 1.2 |
# Basic conversion
./build/chrome -i test_data/test_input.tiff -o test_data/current_output.tiff
# With adjustments (as shown in example above)
./build/chrome -i test_data/test_input.tiff -o test_data/current_output_adj.tiff -cs -sat 50 -exp 1.2
Credits
- Original negfix8 by Chris Hunt
- Original negfix algorithm created by JaZ99
License
Copyright 2025 DWS (Dubey Web Services, DWS LLC)
Licensed under the Apache License, Version 2.0. See LICENSE for details.
Description
Languages
C++
95.4%
CMake
4.6%

