A professional desktop tool for visual side-by-side comparison of two images with real-time analysis — quantitative metrics and visual insight, all running locally on your machine.
Left / Right image panels with synchronized zoom and pan at full resolution.
Full-canvas toggle between images for quick visual comparison of subtle differences.
Per-pixel diff with selectable channels (RGB, R, G, B, Luminance) and adjustable amplification up to 32×.
Real-time Red, Green, Blue, and Lightness histograms with difference highlighting.
64-bit DCT-based hash with Hamming distance and 8×8 bit grid visualization.
Structural Similarity Index decomposed into Luminance, Contrast, and Structural components.
Mean Squared Error computed at original image resolution for maximum accuracy.
Pixel-level color readout with RGB values and per-channel histogram cursor lines.
Self-contained HTML reports, difference images as PNG, and application screenshots.
Full theme support with native dark mode via .NET 10 Application.SetColorMode().
Smaller image is visually upscaled to match the larger one for comparison (display only).
Load images by dragging files onto Left/Right panels. Built-in template images for testing.
All features available with image resolution limited to 1.92 MP (1600 × 1200 px).
No resolution limit — unlock full-resolution comparison with a single in-app purchase.
| F | Toggle Fit / Actual Size (1:1) |
| D | Show / hide Diff panel |
| H | Show / hide Histogram |
| C | Show / hide Crosshair cursors |
| S | Toggle Swap Mode |
| A | Switch Left / Right image (in Swap Mode) |
Quick determination of visual similarity between two images based on frequency content. The result is a 64-bit hash; similar images have similar hashes.
Y = 0.299 × R + 0.587 × G + 0.114 × B
DCT[v,u] = k · C(u) · C(v) · Σx Σy f(y,x) · cos((2x+1)·u·π / 2N) · cos((2y+1)·v·π / 2N)
where k = √(2/N), C(0) = 1/√2, C(n>0) = 1, N = 32.
DCT transforms spatial pixel values into the frequency domain. Low frequencies (top-left corner) represent the overall structure.
[0..7, 0..7]). The DC component [0,0] is zeroed because it represents only average brightness.ulong (64 bits).ulong x = a ^ b; // XOR — ones where hashes differ
int count = 0;
while (x != 0) { count += (int)(x & 1); x >>= 1; } // popcount
Similarity percentage: (64 − distance) × 100 / 64
Visualization: Two 8×8 grids — Left (orange) and Right (violet).
Measures structural similarity in a way that better correlates with human perception than MSE. Value 1.0 = identical, 0.0 = completely different.
Y = 0.299 × R + 0.587 × G + 0.114 × B
Output: double[262144] array (512 × 512 pixels).
μA = (1/N) Σ pA[i], μB = (1/N) Σ pB[i]σ²A = (1/N) Σ (pA[i] − μA)²cov = (1/N) Σ (pA[i] − μA)(pB[i] − μB)Constants: L = 255, K1 = 0.01, K2 = 0.03 (Wang et al. 2004)
C1 = (K1·L)² = 6.5025, C2 = (K2·L)² = 58.5225, C3 = C2/2 = 29.26125
Luminance: l(A,B) = (2·μA·μB + C1) / (μA² + μB² + C1)
Contrast: c(A,B) = (2·σA·σB + C2) / (σ²A + σ²B + C2)
Structural: s(A,B) = (cov + C3) / (σA·σB + C3)
SSIM = l(A,B) × c(A,B) × s(A,B)
Note: This implementation computes global SSIM over the entire image (faster than the Wang et al. sliding-window approach, but less accurate for local artifacts).
Average squared difference between pixels of two images. A simple, widely used metric. MSE = 0 means identical images.
MSE is computed at the original image resolution (not downsampled like SSIM):
max(widthA, widthB) × max(heightA, heightB).LockBits + Marshal.Copy in Format32bppArgb.MSE = (1/N) Σ (YA[i] − YB[i])²
Visualization: progress bar displays 1 − MSE/5000 (inverted, capped at 5000).
Distribution of pixel values in individual channels for quick visual analysis of exposure, contrast, and color balance.
Pixel data is extracted via LockBits with Format32bppArgb. Four channels are computed (int[4][256]):
histogram[0][r]++histogram[1][g]++histogram[2][b]++histogram[3][Y]++ where Y = 0.299R + 0.587G + 0.114BMemory layout (BGRA): pixels[i]=B, pixels[i+1]=G, pixels[i+2]=R, pixels[i+3]=A (alpha ignored).
4 charts side by side (R, G, B, Lightness) in a resizable panel. Rendering layers (back to front):
Cursor lines appear on histograms at the position corresponding to the channel value of the current pixel (orange for Left, violet for Right).
Per-pixel difference visualization. Black = no difference, bright colors = large differences.
diff = |A − B| × amp for each channel separatelydiff = |YA − YB| × amp, grayscale output×1, ×2, ×4 (default), ×8, ×16, ×32. Higher amplification reveals subtle differences but saturates large ones.
Result: min(255, |channelA − channelB| × amp) — clamped to 0–255.
Quick visual comparison by toggling full-canvas view between two images. Useful for detecting subtle differences between nearly identical images.
| S | Toggle Swap Mode on/off |
| A or Left click | Switch between Left and Right image |
Self-contained HTML file with embedded images (base64), histograms, and all metrics. Two variants:
Report includes: images (Left, Right, Diff), 4 histograms, SSIM table with components, MSE, pHash distance + similarity, and 8×8 bit grid visualization.
Saves the current difference bitmap as a PNG file.
Captures the entire application window as a 24-bit RGB PNG.
| Platform | Windows |
|---|---|
| Minimum OS | Windows 10 version 17763.0 or higher |
| Framework | .NET 10.0 |
| Architecture | x64 |