Skip to content

Commit 7a2c88c

Browse files
committed
Bugfix CalcDiff - resizing optional mask on using ResizeOption.Resize
(cherry picked from commit a04e9c8)
1 parent b721746 commit 7a2c88c

File tree

3 files changed

+64
-11
lines changed

3 files changed

+64
-11
lines changed

ImageSharpCompare/ImageSharpCompare.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -406,15 +406,14 @@ public static ICompareResult CalcDiff(Image actual, Image expected, Image maskIm
406406
/// <returns>Mean and absolute pixel error</returns>
407407
public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24> maskImage, ResizeOption resizeOption = ResizeOption.DontResize)
408408
{
409-
var immagesHaveSameDimension = ImagesHaveSameDimension(actual, expected);
409+
var immagesHaveSameDimension = ImagesHaveSameDimension(actual, expected) && ImagesHaveSameDimension(actual, maskImage);
410410

411411
if (resizeOption == ResizeOption.Resize && !immagesHaveSameDimension)
412412
{
413-
var grown = GrowToSameDimension(actual, expected);
414-
var grownMask = GrowToSameDimension(grown.Item1, maskImage);
413+
var grown = GrowToSameDimension(actual, expected, maskImage);
415414
try
416415
{
417-
return CalcDiff(grown.Item1, grown.Item2, grownMask.Item2, ResizeOption.DontResize);
416+
return CalcDiff(grown.Item1, grown.Item2, grown.Item3, ResizeOption.DontResize);
418417
}
419418
finally
420419
{
@@ -573,17 +572,21 @@ public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected
573572
return maskImage;
574573
}
575574

576-
private static (Image<Rgb24>, Image<Rgb24>) GrowToSameDimension(Image<Rgb24> actual, Image<Rgb24> expected)
575+
private static (Image<Rgb24>, Image<Rgb24>, Image<Rgb24>?) GrowToSameDimension(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24>? mask = null)
577576
{
578577
var biggesWidh = actual.Width > expected.Width ? actual.Width : expected.Width;
578+
biggesWidh = biggesWidh > (mask?.Width ?? 0) ? biggesWidh : (mask?.Width ?? 0);
579579
var biggesHeight = actual.Height > expected.Height ? actual.Height : expected.Height;
580+
biggesHeight = biggesHeight > (mask?.Height ?? 0) ? biggesHeight : (mask?.Height ?? 0);
580581

581582
var grownExpected = expected.Clone();
582583
var grownActual = actual.Clone();
584+
var grownMask = mask?.Clone();
583585
grownActual.Mutate(x => x.Resize(biggesWidh, biggesHeight));
584586
grownExpected.Mutate(x => x.Resize(biggesWidh, biggesHeight));
587+
grownMask?.Mutate(x => x.Resize(biggesWidh, biggesHeight));
585588

586-
return (grownActual, grownExpected);
589+
return (grownActual, grownExpected, grownMask);
587590
}
588591
}
589592
}

ImageSharpCompareTestNunit/ImageSharpCompareTest.cs

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public class IntegrationTest
1616
private const string pngBlack2x2px = "../../../TestData/Black.png";
1717
private const string pngBlack4x4px = "../../../TestData/BlackDoubleSize.png";
1818
private const string pngWhite2x2px = "../../../TestData/White.png";
19+
private const string pngTransparent2x2px = "../../../TestData/pngTransparent2x2px.png";
1920

2021
[Test]
2122
[TestCase(jpg0Rgb24, jpg0Rgb24, true)]
@@ -213,9 +214,11 @@ public void Diffmask(string pathPic1, string pathPic2, int expectedMeanError, in
213214
Assert.That(maskedDiff.PixelErrorPercentage, Is.EqualTo(expectedPixelErrorPercentage), "PixelErrorPercentage");
214215
}
215216

216-
[TestCase(png0Rgba32, png1Rgba32, 0, 0, 0, 0)]
217-
[TestCase(jpg0Rgb24, jpg1Rgb24, 0, 0, 0, 0)]
218-
public void ShoulCalcDiffmaskImageSharp(string pathPic1, string pathPic2, int expectedMeanError, int expectedAbsoluteError, int expectedPixelErrorCount, double expectedPixelErrorPercentage)
217+
[TestCase(png0Rgba32, png1Rgba32, 0, 0, 0, 0, ResizeOption.DontResize)]
218+
[TestCase(jpg0Rgb24, jpg1Rgb24, 0, 0, 0, 0, ResizeOption.DontResize)]
219+
[TestCase(jpg0Rgb24, jpg1Rgb24, 0, 0, 0, 0, ResizeOption.Resize)]
220+
[TestCase(pngBlack2x2px, pngBlack4x4px, 0, 0, 0, 0, ResizeOption.Resize)]
221+
public void ShoulCalcDiffmaskImageSharpAndUseOutcome(string pathPic1, string pathPic2, int expectedMeanError, int expectedAbsoluteError, int expectedPixelErrorCount, double expectedPixelErrorPercentage, ResizeOption resizeOption)
219222
{
220223
var absolutePathPic1 = Path.Combine(AppContext.BaseDirectory, pathPic1);
221224
var absolutePathPic2 = Path.Combine(AppContext.BaseDirectory, pathPic2);
@@ -225,13 +228,13 @@ public void ShoulCalcDiffmaskImageSharp(string pathPic1, string pathPic2, int ex
225228
using var absolutePic2 = Image.Load(absolutePathPic2);
226229

227230
using (var fileStreamDifferenceMask = File.Create(differenceMaskPicPath))
228-
using (var maskImage = ImageSharpCompare.CalcDiffMaskImage(absolutePic1, absolutePic2))
231+
using (var maskImage = ImageSharpCompare.CalcDiffMaskImage(absolutePic1, absolutePic2, resizeOption))
229232
{
230233
ImageExtensions.SaveAsPng(maskImage, fileStreamDifferenceMask);
231234
}
232235

233236
using var differenceMaskPic = Image.Load(differenceMaskPicPath);
234-
var maskedDiff = ImageSharpCompare.CalcDiff(absolutePic1, absolutePic2, differenceMaskPic);
237+
var maskedDiff = ImageSharpCompare.CalcDiff(absolutePic1, absolutePic2, differenceMaskPic, resizeOption);
235238
File.Delete(differenceMaskPicPath);
236239

237240
Assert.That(maskedDiff.AbsoluteError, Is.EqualTo(expectedAbsoluteError), "AbsoluteError");
@@ -244,6 +247,53 @@ public void ShoulCalcDiffmaskImageSharp(string pathPic1, string pathPic2, int ex
244247
AssertDisposeBehavior(differenceMaskPic);
245248
}
246249

250+
[TestCase(pngWhite2x2px, pngBlack2x2px, pngTransparent2x2px, 765, 12240, 16, 100d, ResizeOption.Resize)]
251+
[TestCase(pngWhite2x2px, pngBlack2x2px, pngBlack4x4px, 765, 12240, 16, 100d, ResizeOption.Resize)]
252+
[TestCase(pngBlack2x2px, pngBlack2x2px, pngBlack4x4px, 0, 0, 0, 0, ResizeOption.Resize)]
253+
[TestCase(pngBlack2x2px, pngBlack4x4px, pngBlack2x2px, 0, 0, 0, 0, ResizeOption.Resize)]
254+
[TestCase(pngBlack4x4px, pngBlack2x2px, pngBlack2x2px, 0, 0, 0, 0, ResizeOption.Resize)]
255+
public void ShoulUseDiffMask(string pathPic1, string pathPic2, string pathPic3, double expectedMeanError, int expectedAbsoluteError, int expectedPixelErrorCount, double expectedPixelErrorPercentage, ResizeOption resizeOption)
256+
{
257+
var absolutePathPic1 = Path.Combine(AppContext.BaseDirectory, pathPic1);
258+
var absolutePathPic2 = Path.Combine(AppContext.BaseDirectory, pathPic2);
259+
var differenceMaskPic = Path.Combine(AppContext.BaseDirectory, pathPic3);
260+
using var pic1 = Image.Load(absolutePathPic1);
261+
using var pic2 = Image.Load(absolutePathPic2);
262+
using var maskPic = Image.Load(differenceMaskPic);
263+
264+
var maskedDiff = ImageSharpCompare.CalcDiff(pic1, pic2, maskPic, resizeOption);
265+
266+
Assert.That(maskedDiff.MeanError, Is.EqualTo(expectedMeanError), "MeanError");
267+
Assert.That(maskedDiff.AbsoluteError, Is.EqualTo(expectedAbsoluteError), "AbsoluteError");
268+
Assert.That(maskedDiff.PixelErrorCount, Is.EqualTo(expectedPixelErrorCount), "PixelErrorCount");
269+
Assert.That(maskedDiff.PixelErrorPercentage, Is.EqualTo(expectedPixelErrorPercentage), "PixelErrorPercentage");
270+
271+
AssertDisposeBehavior(pic1);
272+
AssertDisposeBehavior(pic2);
273+
AssertDisposeBehavior(maskPic);
274+
}
275+
276+
[TestCase(pngBlack2x2px, pngBlack2x2px, pngBlack4x4px)]
277+
[TestCase(pngBlack2x2px, pngBlack4x4px, pngBlack2x2px)]
278+
[TestCase(pngBlack4x4px, pngBlack2x2px, pngBlack2x2px)]
279+
public void ShoulThrowUsingInvalidImageDimenstionsDiffMask(string pathPic1, string pathPic2, string pathPic3)
280+
{
281+
var absolutePathPic1 = Path.Combine(AppContext.BaseDirectory, pathPic1);
282+
var absolutePathPic2 = Path.Combine(AppContext.BaseDirectory, pathPic2);
283+
var differenceMaskPic = Path.Combine(AppContext.BaseDirectory, pathPic3);
284+
using var pic1 = Image.Load(absolutePathPic1);
285+
using var pic2 = Image.Load(absolutePathPic2);
286+
using var maskPic = Image.Load(differenceMaskPic);
287+
288+
var exception = Assert.Throws<ImageSharpCompareException>(() => ImageSharpCompare.CalcDiff(pic1, pic2, maskPic, ResizeOption.DontResize));
289+
290+
Assert.That(exception?.Message, Is.EqualTo("Size of images differ."));
291+
292+
AssertDisposeBehavior(pic1);
293+
AssertDisposeBehavior(pic2);
294+
AssertDisposeBehavior(maskPic);
295+
}
296+
247297
private void AssertDisposeBehavior(Image image)
248298
{
249299
const string imageSharpPrivateFieldNameIsDisposed = "isDisposed";
489 Bytes
Loading

0 commit comments

Comments
 (0)