About
Published on Maven Central and jCenter Java Library that compares 2 images with the same sizes and shows the differences visually by drawing rectangles. Some parts of the image can be excluded from the comparison. Can be used for automation qa tests. The Usages of the image-comparison
can be found here Usage Image Comparison
-
Implementation is using only standard core language and platform features, no 3rd party libraries and plagiarized code is permitted.
-
Pixels (with the same coordinates in two images) can be visually similar, but have different values of RGB. 2 pixels are considered to be "different" if they differ more than
pixelToleranceLevel
(this configuration described below) from each other. -
The output of the comparison is a copy of
actual
images. The differences are outlined with red rectangles as shown below. -
No third party libraries or borrowed code are in usage.
-
Some parts of the image can be excluded from the comparison and drawn in the result image.
Article about growing image-comparison
on habr: How did the test task become a production library
Configurations
Property | Description |
---|---|
threshold |
The threshold which means the max distance between non-equal pixels. Could be changed according size and requirements to the image. |
rectangleLineWidth |
Width of the line that is drawn the rectangle. |
destination |
File of the result destination. |
minimalRectangleSize |
The number of the minimal rectangle size. Count as (width x height). By default it's 1. |
maximalRectangleCount |
Maximal count of the Rectangles, which would be drawn. It means that would get first x biggest rectangles. Default value is -1, that means that all the rectangles would be drawn. |
pixelToleranceLevel |
Level of the pixel tolerance. By default it's 0.1 -> 10% difference. The value can be set from 0.0 to 0.99. |
excludedAreas |
ExcludedAreas contains a List of Rectangles to be ignored when comparing images. |
drawExcludedRectangles |
Flag which says draw excluded rectangles or not. |
fillExcludedRectangles |
Flag which says fill excluded rectangles or not. |
percentOpacityExcludedRectangles |
The desired opacity of the excluded rectangle fill. |
fillDifferenceRectangles |
Flag which says fill difference rectangles or not. |
percentOpacityDifferenceRectangles |
The desired opacity of the difference rectangle fill. |
allowingPercentOfDifferentPixels |
The percent of the allowing pixels to be different to stay MATCH for comparison. E.g. percent of the pixels, which would ignore in comparison. Value can be from 0.0 to 100.00 |
Release Notes
Can be found in RELEASE_NOTES.
Usage
Maven
<dependency>
<groupId>com.github.romankh3</groupId>
<artifactId>image-comparison</artifactId>
<version>4.3.0</version>
</dependency>
Gradle
compile 'com.github.romankh3:image-comparison:4.3.0'
To compare two images programmatically
class Example {
public static void main( String[] args ) {
// load the images to be compared
BufferedImage expectedImage = ImageComparisonUtil.readImageFromResources("expected.png");
BufferedImage actualImage = ImageComparisonUtil.readImageFromResources("actual.png");
// where to save the result (leave null if you want to see the result in the UI)
File resultDestination = new File( "result.png" );
//Create ImageComparison object for it.
ImageComparison imageComparison = new ImageComparison( expectedImage, actualImage, resultDestination );
//Can be used another constructor for it, without destination.
new ImageComparison("expected.png", "actual.png");
//or
new ImageComparison(expectedImage, actualImage);
//Also can be configured BEFORE comparing next properties:
//Threshold - it's the max distance between non-equal pixels. By default it's 5.
imageComparison.setThreshold(10);
imageComparison.getThreshold();
//RectangleListWidth - Width of the line that is drawn in the rectangle. By default it's 1.
imageComparison.setRectangleLineWidth(5);
imageComparison.getRectangleLineWidth();
//DifferenceRectangleFilling - Fill the inside the difference rectangles with a transparent fill. By default it's false and 20.0% opacity.
imageComparison.setDifferenceRectangleFilling(true, 30.0);
imageComparison.isFillDifferenceRectangles();
imageComparison.getPercentOpacityDifferenceRectangles();
//ExcludedRectangleFilling - Fill the inside the excluded rectangles with a transparent fill. By default it's false and 20.0% opacity.
imageComparison.setExcludedRectangleFilling(true, 30.0);
imageComparison.isFillExcludedRectangles();
imageComparison.getPercentOpacityExcludedRectangles();
//Destination. Before comparing also can be added destination file for result image.
imageComparison.setDestination(resultDestination);
imageComparison.getDestination();
//MaximalRectangleCount - It means that would get first x biggest rectangles for drawing.
// by default all the rectangles would be drawn.
imageComparison.setMaximalRectangleCount(10);
imageComparison.getMaximalRectangleCount();
//MinimalRectangleSize - The number of the minimal rectangle size. Count as (width x height).
// by default it's 1.
imageComparison.setMinimalRectangleSize(100);
imageComparison.getMinimalRectangleSize();
//Change the level of the pixel tolerance:
imageComparison.setPixelToleranceLevel(0.2);
imageComparison.getPixelToleranceLevel();
//After configuring the ImageComparison object, can be executed compare() method:
ImageComparisonResult imageComparisonResult = imageComparison.compareImages();
//Can be found ComparisonState.
ImageComparisonState imageComparisonState = imageComparisonResult.getImageComparisonState();
//And Result Image
BufferedImage resultImage = imageComparisonResult.getResult();
//Image can be saved after comparison, using ImageComparisonUtil.
ImageComparisonUtil.saveImage(resultDestination, resultImage);
}
}
Demo
Demo shows how image-comparison
works.
Expected Image
Actual Image
Result
Contributing
Please, follow Contributing page.
Code of Conduct
Please, follow Code of Conduct page.
License
This project is Apache License 2.0 - see the LICENSE file for details
@dee-y for designing this logo
ThanksAlso if you're interesting - see my other repositories
- skyscanner-flight-api-clinet - Client for a Skyscanner Flight Search API hosted in Rapid API
- Flights Monitoring - app for monitoring flights cost based on Skyscanner API
- Raspberry home ecosystem - home ecosystem based on raspberry pi.
- Movie Tracking - Simple API for tracking movies with favorite actors for the specific time.
- Tic Tac Toe NxM - Own implementation. For any rectangle and any winner line count.