Skip to content

Navigation Menu

Sign in
    • GitHub Copilot
      Write better code with AI
    • Security
      Find and fix vulnerabilities
    • Actions
      Automate any workflow
    • Codespaces
      Instant dev environments
    • Issues
      Plan and track work
    • Code Review
      Manage code changes
    • Discussions
      Collaborate outside of code
    • Code Search
      Find more, search less
    Explore
    • All features
    • Documentation
    • GitHub Skills
    • Blog
  • By company size
    • Enterprises
    • Small and medium teams
    • Startups
    • Nonprofits
    By use case
    • DevSecOps
    • DevOps
    • CI/CD
    • View all use cases
    By industry
    • Healthcare
    • Financial services
    • Manufacturing
    • Government
    • View all industries
    View all solutions
  • Topics
    • AI
    • DevOps
    • Security
    • Software Development
    • View all
    Explore
    • Learning Pathways
    • Events & Webinars
    • Ebooks & Whitepapers
    • Customer Stories
    • Partners
    • Executive Insights
    • GitHub Sponsors
      Fund open source developers
    • The ReadME Project
      GitHub community articles
    Repositories
    • Topics
    • Trending
    • Collections
    • Enterprise platform
      AI-powered developer platform
    Available add-ons
    • Advanced Security
      Enterprise-grade security features
    • GitHub Copilot
      Enterprise-grade AI features
    • Premium Support
      Enterprise-grade 24/7 support
  • Pricing

Search code, repositories, users, issues, pull requests...

Clear
    Search syntax tips

    Provide feedback

    We read every piece of feedback, and take your input very seriously.

    Saved searches

    Use saved searches to filter your results more quickly

    To see all available qualifiers, see our documentation.

    Sign in
    Sign up
    You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
    JaosnHsieh / Resemble.js Public
    forked from rsmbl/Resemble.js
    • Notifications You must be signed in to change notification settings
    • Fork 0
    • Star 0

    Image analysis and comparison

    rsmbl.github.io/Resemble.js/

    License

    MIT license
    0 stars 426 forks Branches Tags Activity
    Star
    Notifications You must be signed in to change notification settings
    • Code
    • Pull requests 0
    • Actions
    • Projects 0
    • Security
    • Insights
    Additional navigation options
    • Code
    • Pull requests
    • Actions
    • Projects
    • Security
    • Insights

    JaosnHsieh/Resemble.js

    BranchesTags
     
     

    Folders and files

    NameName
    Last commit message
    Last commit date

    Latest commit

     Cannot retrieve latest commit at this time.

    History

    284 Commits
    .github/workflows
    .github/workflows
     
     
    chai-tests
    chai-tests
     
     
    demoassets
    demoassets
     
     
    libs/twitter-bootstrap
    libs/twitter-bootstrap
     
     
    nodejs-tests
    nodejs-tests
     
     
    .dockerignore
    .dockerignore
     
     
    .editorconfig
    .editorconfig
     
     
    .eslintignore
    .eslintignore
     
     
    .eslintrc
    .eslintrc
     
     
    .gitignore
    .gitignore
     
     
    .npmignore
    .npmignore
     
     
    .prettierrc
    .prettierrc
     
     
    CODE_OF_CONDUCT.md
    CODE_OF_CONDUCT.md
     
     
    CONTRIBUTING.md
    CONTRIBUTING.md
     
     
    LICENSE
    LICENSE
     
     
    README.md
    README.md
     
     
    bower.json
    bower.json
     
     
    compareImages.js
    compareImages.js
     
     
    dockerfile
    dockerfile
     
     
    index.html
    index.html
     
     
    memory-leak-test.js
    memory-leak-test.js
     
     
    output.png
    output.png
     
     
    package-lock.json
    package-lock.json
     
     
    package.json
    package.json
     
     
    resemble.js
    resemble.js
     
     

    Repository files navigation

    • README
    • Code of conduct
    • MIT license

    Low-maintenance mode: Two to four times a year the library author will spend some time to keep the library useful. Feel free to raise issues and contribute improvements, but please be aware that it may be sometime before a response is given.


    Resemble.js

    Build Status Coverage Code Health MIT License NPM Downloads

    Analyse and compare images with Javascript and HTML5. More info & Resemble.js Demo. Compatible with Node.js >8.


    Get it

    npm install resemblejs

    Node.js

    Resemble.js uses node-canvas for Node.js support. This is a pre-built dependency that may fail in certain environments. If you are using Resemble.js for in-browser analysis only, you can skip the node-canvas dependency with npm install --no-optional. If you need Node.js support and the Canvas dependency fails, try using a previous version of Resemble.js, or npm install --build-from-source.

    Example

    Retrieve basic analysis on an image:

    var api = resemble(fileData).onComplete(function (data) {
        console.log(data);
        /*
    	{
    	  red: 255,
    	  green: 255,
    	  blue: 255,
    	  brightness: 255
    	}
    	*/
    });

    Use resemble to compare two images:

    var diff = resemble(file)
        .compareTo(file2)
        .ignoreColors()
        .onComplete(function (data) {
            console.log(data);
        });

    Scale second image to dimensions of the first one:

    diff.scaleToSameSize();

    You can also change the comparison method after the first analysis:

    diff.ignoreAntialiasing();

    And change the output display style:

    resemble.outputSettings({
        errorColor: {
            red: 255,
            green: 0,
            blue: 255
        },
        errorType: "movement",
        transparency: 0.3,
        largeImageThreshold: 1200,
        useCrossOrigin: false,
        outputDiff: true
    });
    // .repaint();

    Note: resemble.outputSettings mutates global state, effecting all subsequent call to Resemble.

    It is possible to narrow down the area of comparison, by specifying a bounding box measured in pixels from the top left:

    const box = {
        left: 100,
        top: 200,
        right: 200,
        bottom: 600
    };
    resemble.outputSettings({ boundingBox: box });
    resemble.outputSettings({ boundingBoxes: [box1, box2] });

    You can also exclude part of the image from comparison, by specifying the excluded area in pixels from the top left:

    const box = {
        left: 100,
        top: 200,
        right: 200,
        bottom: 600
    };
    resemble.outputSettings({ ignoredBox: box });
    resemble.outputSettings({ ignoredBoxes: [box1, box2] });

    Another way to exclude parts of the image from comparison, is using the ignoreAreasColoredWith option. Any pixels that match the specified color on a reference image will be excluded from comparison:

    const color = {
        r: 255,
        g: 0,
        b: 0,
        a: 255
    };
    resemble.outputSettings({ ignoreAreasColoredWith: color });

    By default, the comparison algorithm skips pixels when the image width or height is larger than 1200 pixels. This is there to mitigate performance issues.

    You can modify this behaviour by setting the largeImageThreshold option to a different value. Set it to 0 to switch it off completely.

    Resemble.js also supports Data URIs as strings:

    resemble.outputSettings({ useCrossOrigin: false });
    var diff = resemble("data:image/jpeg;base64,/9j/4AAQSkZJRgAB...").compareTo("data:image/jpeg;base64,/9j/,/9j/4AAQSkZJRg...");

    useCrossOrigin is true by default, you might need to set it to false if you're using Data URIs.

    If you'd like resemble to return early:

    resemble(img1)
        .compareTo(img2)
        .setReturnEarlyThreshold(8)
        .onComplete((data) => {
            /* do something */
        });

    Single callback api

    The resemble.compare API provides a convenience function that is used as follows:

    const compare = require("resemblejs").compare;
    
    function getDiff() {
        const options = {
            returnEarlyThreshold: 5
        };
    
        compare(image1, image2, options, function (err, data) {
            if (err) {
                console.log("An error!");
            } else {
                console.log(data);
            }
        });
    }

    Node.js

    Usage

    The API under Node is the same as on the resemble.compare but promise based:

    const compareImages = require("resemblejs/compareImages");
    const fs = require("mz/fs");
    
    async function getDiff() {
        const options = {
            output: {
                errorColor: {
                    red: 255,
                    green: 0,
                    blue: 255
                },
                errorType: "movement",
                transparency: 0.3,
                largeImageThreshold: 1200,
                useCrossOrigin: false,
                outputDiff: true
            },
            scaleToSameSize: true,
            ignore: "antialiasing"
        };
    
        const data = await compareImages(await fs.readFile("./your-image-path/People.jpg"), await fs.readFile("./your-image-path/People2.jpg"), options);
    
        await fs.writeFile("./output.png", data.getBuffer());
    }
    
    getDiff();

    Tests

    To run the tests on Node (using Jest), type:

    npm run test

    There are also some in-browser tests. To run these install and run a http-server such as http-server from the root of the project. Then in the browser, navigate to localhost:8080/chai-tests/test.html, open up the developer console to see the results.

    Dockerfile

    For convenience I've added a simple Dockerfile to run the NodeJS tests in an Ubuntu container

    docker build -t rsmbl/resemble .
    docker run rsmbl/resemble

    Reference to academic papers

    As people have asked in the past, Resemble.js hasn't knowingly implemented any published ideas. RGBA colour comparison is simple and straightforward when working with the Canvas API. The antialiasing algorithm was developed at Huddle over several days of trial-and-error using various false-positive results from PhantomCSS tests.


    Created by James Cryer and the Huddle development team.

    About

    Image analysis and comparison

    rsmbl.github.io/Resemble.js/

    Resources

    Readme

    License

    MIT license

    Code of conduct

    Code of conduct
    Activity

    Stars

    0 stars

    Watchers

    1 watching

    Forks

    0 forks
    Report repository

    Releases

    38 tags

    Packages 0

    No packages published

    Languages

    • JavaScript 82.6%
    • HTML 14.1%
    • CSS 3.3%

    Footer

    © 2025 GitHub, Inc.

    Footer navigation

    • Terms
    • Privacy
    • Security
    • Status
    • Docs
    • Contact
    You can’t perform that action at this time.