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
    mark-unscriptd / 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

    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

    mark-unscriptd/Resemble.js

    BranchesTags
     
     

    Folders and files

    NameName
    Last commit message
    Last commit date

    Latest commit

     Cannot retrieve latest commit at this time.

    History

    219 Commits
    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
     
     
    .travis.yml
    .travis.yml
     
     
    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
     
     
    package-lock.json
    package-lock.json
     
     
    package.json
    package.json
     
     
    resemble.js
    resemble.js
     
     

    Repository files navigation

    • README
    • Code of conduct
    • MIT license

    Resemble.js

    Build Status Code Health Build Status NPM Downloads

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


    Get it

    npm install resemblejs

    bower install resemblejs

    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);
            /*
    	{
    	  misMatchPercentage : 100, // %
    	  isSameDimensions: true, // or false
    	  dimensionDifference: { width: 0, height: -1 }, // defined if dimensions are not the same
    	  getImageDataUrl: function(){}
    	}
    	*/
        });

    Scale second image to dimensions of the first one:

    //diff.useOriginalSize();
    diff.scaleToSameSize();

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

    // diff.ignoreNothing();
    // diff.ignoreColors();
    // diff.ignoreAlpha();
    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();

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

    resemble.outputSettings({
        boundingBox: {
            left: 100,
            top: 200,
            right: 200,
            bottom: 600
        }
    });
    // .repaint();

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

    resemble.outputSettings({
        ignoredBox: {
            left: 100,
            top: 200,
            right: 200,
            bottom: 600
        }
    });
    // .repaint();

    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.

    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 = {};
        // The parameters can be Node Buffers
        // data is the same as usual with an additional getBuffer() function
        compare(image1, image2, options, function(err, data) {
            if (err) {
                console.log("An error!");
            } else {
                console.log(data);
                /*
                {
                misMatchPercentage : 100, // %
                isSameDimensions: true, // or false
                dimensionDifference: { width: 0, height: -1 }, // defined if dimensions are not the same
                getImageDataUrl: function(){}
                }
                */
            }
        });
    }

    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"
        };
    
        // The parameters can be Node Buffers
        // data is the same as usual with an additional getBuffer() function
        const data = await compareImages(
            await fs.readFile("./demoassets/People.jpg"),
            await fs.readFile("./demoassets/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 huddle/resemble .
    docker run huddle/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 algorithim 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

    Resources

    Readme

    License

    MIT license

    Code of conduct

    Code of conduct
    Activity

    Stars

    0 stars

    Watchers

    1 watching

    Forks

    0 forks
    Report repository

    Releases

    28 tags

    Packages 0

    No packages published

    Languages

    • JavaScript 80.8%
    • HTML 15.3%
    • CSS 3.9%

    Footer

    © 2025 GitHub, Inc.

    Footer navigation

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