The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]metanet.ch.

Fast pixel-by-pixel image comparison for R, powered by odiff.
Odiffr requires the Odiff binary to be installed on your system:
# npm (cross-platform, recommended)
npm install -g odiff-bin
# Or download binaries from GitHub releases
# https://github.com/dmtrKovalenko/odiff/releases# Install from CRAN (when available)
install.packages("odiffr")
# Or install the development version from GitHub
# install.packages("pak")
pak::pak("BenWolst/odiffr")If you cannot install Odiff system-wide:
odiffr::odiffr_update() # Downloads to user cachelibrary(odiffr)
# Compare two images
result <- compare_images("baseline.png", "current.png")
result$match
#> [1] FALSE
result$diff_percentage
#> [1] 2.45
# Generate a diff image
result <- compare_images("baseline.png", "current.png", diff_output = "diff.png")# High-level API (returns tibble if available)
result <- compare_images("img1.png", "img2.png")
# Low-level API (returns detailed list)
result <- odiff_run("img1.png", "img2.png")# Adjust sensitivity threshold (0-1, lower = more precise)
result <- compare_images("img1.png", "img2.png", threshold = 0.05)
# Ignore antialiased pixels
result <- compare_images("img1.png", "img2.png", antialiasing = TRUE)
# Fail immediately if dimensions differ
result <- compare_images("img1.png", "img2.png", fail_on_layout = TRUE)# Ignore specific areas (e.g., timestamps, dynamic content)
result <- compare_images("img1.png", "img2.png",
ignore_regions = list(
ignore_region(0, 0, 200, 50), # Header
ignore_region(0, 500, 800, 600) # Footer
)
)# Compare multiple image pairs
pairs <- data.frame(
img1 = c("baseline/page1.png", "baseline/page2.png"),
img2 = c("current/page1.png", "current/page2.png")
)
results <- compare_images_batch(pairs, diff_dir = "diffs/")
results[!results$match, ] # Show failureslibrary(magick)
# Compare magick-image objects directly
img1 <- image_read("baseline.png") |> image_resize("800x600")
img2 <- image_read("current.png") |> image_resize("800x600")
result <- compare_images(img1, img2)# Check if Odiff is available
odiff_available()
# Get version and configuration info
odiff_info()
# Update to latest version (downloads to user cache)
odiffr_update()
# Use a specific binary
options(odiffr.path = "/path/to/odiff")options(odiffr.path = "...") - User overrideSys.which("odiff"))odiffr_update()| Type | Formats |
|---|---|
| Input | PNG, JPEG, WEBP, TIFF |
| Output | PNG only |
Cross-format comparison is supported (e.g., compare JPEG to PNG).
Odiffr is designed for use in validated pharmaceutical and clinical research:
options(odiffr.path = ...)odiff_version() to
document binary version for audit trails# Pin to a specific validated binary
options(odiffr.path = "/validated/bin/odiff-4.1.2")
# Document in validation scripts
info <- odiff_info()
sprintf("Using odiff %s from %s", info$version, info$source)Odiff is approximately 6x faster than ImageMagick for pixel comparison, thanks to SIMD optimizations. Performance scales well with image size.
MIT
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.