Skip to content

Commit 835fa8e

Browse files
authored
Added optional parameter pixelColorShiftTolerance
2 parents 5df0cbf + d06716a commit 835fa8e

File tree

6 files changed

+78
-54
lines changed

6 files changed

+78
-54
lines changed

ImageSharpCompare/ImageSharpCompare.cs

Lines changed: 51 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -209,12 +209,13 @@ public static bool ImagesAreEqual(Image<Rgb24> actual, Image<Rgb24> expected, Re
209209
/// <param name="pathActualImage"></param>
210210
/// <param name="pathExpectedImage"></param>
211211
/// <param name="resizeOption"></param>
212+
/// <param name="pixelColorShiftTolerance"></param>
212213
/// <returns>Mean and absolute pixel error</returns>
213-
public static ICompareResult CalcDiff(string pathActualImage, string pathExpectedImage, ResizeOption resizeOption = ResizeOption.DontResize)
214+
public static ICompareResult CalcDiff(string pathActualImage, string pathExpectedImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance=0)
214215
{
215216
using var actual = Image.Load(pathActualImage);
216217
using var expected = Image.Load(pathExpectedImage);
217-
return CalcDiff(actual, expected, resizeOption);
218+
return CalcDiff(actual, expected, resizeOption, pixelColorShiftTolerance);
218219
}
219220

220221
/// <summary>
@@ -224,13 +225,14 @@ public static ICompareResult CalcDiff(string pathActualImage, string pathExpecte
224225
/// <param name="pathExpectedImage"></param>
225226
/// <param name="pathMaskImage"></param>
226227
/// <param name="resizeOption"></param>
228+
/// <param name="pixelColorShiftTolerance"></param>
227229
/// <returns>Mean and absolute pixel error</returns>
228-
public static ICompareResult CalcDiff(string pathActualImage, string pathExpectedImage, string pathMaskImage, ResizeOption resizeOption = ResizeOption.DontResize)
230+
public static ICompareResult CalcDiff(string pathActualImage, string pathExpectedImage, string pathMaskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
229231
{
230232
using var actual = Image.Load(pathActualImage);
231233
using var expected = Image.Load(pathExpectedImage);
232234
using var mask = Image.Load(pathMaskImage);
233-
return CalcDiff(actual, expected, mask, resizeOption);
235+
return CalcDiff(actual, expected, mask, resizeOption, pixelColorShiftTolerance);
234236
}
235237

236238
/// <summary>
@@ -239,12 +241,13 @@ public static ICompareResult CalcDiff(string pathActualImage, string pathExpecte
239241
/// <param name="actualImage"></param>
240242
/// <param name="expectedImage"></param>
241243
/// <param name="resizeOption"></param>
244+
/// <param name="pixelColorShiftTolerance"></param>
242245
/// <returns>Mean and absolute pixel error</returns>
243-
public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage, ResizeOption resizeOption = ResizeOption.DontResize)
246+
public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
244247
{
245248
using var actual = Image.Load(actualImage);
246249
using var expected = Image.Load(expectedImage);
247-
return CalcDiff(actual, expected, resizeOption);
250+
return CalcDiff(actual, expected, resizeOption, pixelColorShiftTolerance);
248251
}
249252

250253
/// <summary>
@@ -254,12 +257,13 @@ public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage,
254257
/// <param name="expectedImage"></param>
255258
/// <param name="maskImage"></param>
256259
/// <param name="resizeOption"></param>
260+
/// <param name="pixelColorShiftTolerance"></param>
257261
/// <returns></returns>
258-
public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage, Image maskImage, ResizeOption resizeOption = ResizeOption.DontResize)
262+
public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage, Image maskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
259263
{
260264
using var actual = Image.Load(actualImage);
261265
using var expected = Image.Load(expectedImage);
262-
return CalcDiff(actual, expected, maskImage, resizeOption);
266+
return CalcDiff(actual, expected, maskImage, resizeOption, pixelColorShiftTolerance);
263267
}
264268

265269
/// <summary>
@@ -268,11 +272,11 @@ public static ICompareResult CalcDiff(Stream actualImage, Stream expectedImage,
268272
/// <param name="actual"></param>
269273
/// <param name="expected"></param>
270274
/// <param name="resizeOption"></param>
275+
/// <param name="pixelColorShiftTolerance"></param>
271276
/// <returns>Mean and absolute pixel error</returns>
272-
public static ICompareResult CalcDiff(Image actual, Image expected, ResizeOption resizeOption = ResizeOption.DontResize)
277+
public static ICompareResult CalcDiff(Image actual, Image expected, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
273278
{
274279
ArgumentNullException.ThrowIfNull(actual);
275-
276280
ArgumentNullException.ThrowIfNull(expected);
277281

278282
var ownsActual = false;
@@ -285,7 +289,7 @@ public static ICompareResult CalcDiff(Image actual, Image expected, ResizeOption
285289
actualRgb24 = ToRgb24Image(actual, out ownsActual);
286290
expectedRgb24 = ToRgb24Image(expected, out ownsExpected);
287291

288-
return CalcDiff(actualRgb24, expectedRgb24, resizeOption);
292+
return CalcDiff(actualRgb24, expectedRgb24, resizeOption, pixelColorShiftTolerance);
289293
}
290294
finally
291295
{
@@ -306,8 +310,9 @@ public static ICompareResult CalcDiff(Image actual, Image expected, ResizeOption
306310
/// <param name="actual"></param>
307311
/// <param name="expected"></param>
308312
/// <param name="resizeOption"></param>
313+
/// <param name="pixelColorShiftTolerance"></param>
309314
/// <returns>Mean and absolute pixel error</returns>
310-
public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected, ResizeOption resizeOption = ResizeOption.DontResize)
315+
public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
311316
{
312317
var imagesHaveSameDimension = ImagesHaveSameDimension(actual, expected);
313318

@@ -316,7 +321,7 @@ public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected
316321
var grown = GrowToSameDimension(actual, expected);
317322
try
318323
{
319-
return CalcDiff(grown.Item1, grown.Item2, ResizeOption.DontResize);
324+
return CalcDiff(grown.Item1, grown.Item2, ResizeOption.DontResize, pixelColorShiftTolerance);
320325
}
321326
finally
322327
{
@@ -344,9 +349,9 @@ public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected
344349
var r = Math.Abs(expectedPixel.R - actualPixel.R);
345350
var g = Math.Abs(expectedPixel.G - actualPixel.G);
346351
var b = Math.Abs(expectedPixel.B - actualPixel.B);
347-
absoluteError = absoluteError + r + g + b;
348-
349-
pixelErrorCount += r + g + b > 0 ? 1 : 0;
352+
var sum = r + g + b;
353+
absoluteError = absoluteError + (sum > pixelColorShiftTolerance ? sum :0) ;
354+
pixelErrorCount +=( sum > pixelColorShiftTolerance )? 1 : 0;
350355
}
351356
}
352357

@@ -355,15 +360,18 @@ public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected
355360
return new CompareResult(absoluteError, meanError, pixelErrorCount, pixelErrorPercentage);
356361
}
357362

363+
364+
358365
/// <summary>
359366
/// Calculates ICompareResult expressing the amount of difference of both images using a image mask for tolerated difference between the two images
360367
/// </summary>
361368
/// <param name="actual"></param>
362369
/// <param name="expected"></param>
363370
/// <param name="maskImage"></param>
364371
/// <param name="resizeOption"></param>
372+
/// <param name="pixelColorShiftTolerance"></param>
365373
/// <returns>Mean and absolute pixel error</returns>
366-
public static ICompareResult CalcDiff(Image actual, Image expected, Image maskImage, ResizeOption resizeOption = ResizeOption.DontResize)
374+
public static ICompareResult CalcDiff(Image actual, Image expected, Image maskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
367375
{
368376
ArgumentNullException.ThrowIfNull(actual);
369377

@@ -410,8 +418,9 @@ public static ICompareResult CalcDiff(Image actual, Image expected, Image maskIm
410418
/// <param name="expected"></param>
411419
/// <param name="maskImage"></param>
412420
/// <param name="resizeOption"></param>
421+
/// <param name="pixelColorShiftTolerance"></param>
413422
/// <returns>Mean and absolute pixel error</returns>
414-
public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24> maskImage, ResizeOption resizeOption = ResizeOption.DontResize)
423+
public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24> maskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
415424
{
416425
ArgumentNullException.ThrowIfNull(maskImage);
417426

@@ -485,12 +494,13 @@ public static ICompareResult CalcDiff(Image<Rgb24> actual, Image<Rgb24> expected
485494
/// <param name="pathActualImage"></param>
486495
/// <param name="pathExpectedImage"></param>
487496
/// <param name="resizeOption"></param>
497+
/// <param name="pixelColorShiftTolerance"></param>
488498
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
489-
public static Image CalcDiffMaskImage(string pathActualImage, string pathExpectedImage, ResizeOption resizeOption = ResizeOption.DontResize)
499+
public static Image CalcDiffMaskImage(string pathActualImage, string pathExpectedImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
490500
{
491501
using var actual = Image.Load(pathActualImage);
492502
using var expected = Image.Load(pathExpectedImage);
493-
return CalcDiffMaskImage(actual, expected, resizeOption);
503+
return CalcDiffMaskImage(actual, expected, resizeOption, pixelColorShiftTolerance);
494504
}
495505

496506
/// <summary>
@@ -500,13 +510,14 @@ public static Image CalcDiffMaskImage(string pathActualImage, string pathExpecte
500510
/// <param name="pathExpectedImage"></param>
501511
/// <param name="pathMaskImage"></param>
502512
/// <param name="resizeOption"></param>
513+
/// <param name="pixelColorShiftTolerance"></param>
503514
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
504-
public static Image CalcDiffMaskImage(string pathActualImage, string pathExpectedImage, string pathMaskImage, ResizeOption resizeOption = ResizeOption.DontResize)
515+
public static Image CalcDiffMaskImage(string pathActualImage, string pathExpectedImage, string pathMaskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
505516
{
506517
using var actual = Image.Load(pathActualImage);
507518
using var expected = Image.Load(pathExpectedImage);
508519
using var mask = Image.Load(pathMaskImage);
509-
return CalcDiffMaskImage(actual, expected, mask, resizeOption);
520+
return CalcDiffMaskImage(actual, expected, mask, resizeOption, pixelColorShiftTolerance);
510521
}
511522

512523
/// <summary>
@@ -515,12 +526,13 @@ public static Image CalcDiffMaskImage(string pathActualImage, string pathExpecte
515526
/// <param name="actualImage"></param>
516527
/// <param name="expectedImage"></param>
517528
/// <param name="resizeOption"></param>
529+
/// <param name="pixelColorShiftTolerance"></param>
518530
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
519-
public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage, ResizeOption resizeOption = ResizeOption.DontResize)
531+
public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
520532
{
521533
using var actual = Image.Load(actualImage);
522534
using var expected = Image.Load(expectedImage);
523-
return CalcDiffMaskImage(actual, expected, resizeOption);
535+
return CalcDiffMaskImage(actual, expected, resizeOption, pixelColorShiftTolerance);
524536
}
525537

526538
/// <summary>
@@ -530,13 +542,14 @@ public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage,
530542
/// <param name="expectedImage"></param>
531543
/// <param name="maskImage"></param>
532544
/// <param name="resizeOption"></param>
545+
/// <param name="pixelColorShiftTolerance"></param>
533546
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
534-
public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage, Stream maskImage, ResizeOption resizeOption = ResizeOption.DontResize)
547+
public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage, Stream maskImage, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
535548
{
536549
using var actual = Image.Load(actualImage);
537550
using var expected = Image.Load(expectedImage);
538551
using var mask = Image.Load(maskImage);
539-
return CalcDiffMaskImage(actual, expected, mask, resizeOption);
552+
return CalcDiffMaskImage(actual, expected, mask, resizeOption, pixelColorShiftTolerance);
540553
}
541554

542555
/// <summary>
@@ -545,8 +558,9 @@ public static Image CalcDiffMaskImage(Stream actualImage, Stream expectedImage,
545558
/// <param name="actual"></param>
546559
/// <param name="expected"></param>
547560
/// <param name="resizeOption"></param>
561+
/// <param name="pixelColorShiftTolerance"></param>
548562
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
549-
public static Image CalcDiffMaskImage(Image actual, Image expected, ResizeOption resizeOption = ResizeOption.DontResize)
563+
public static Image CalcDiffMaskImage(Image actual, Image expected, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
550564
{
551565
ArgumentNullException.ThrowIfNull(actual);
552566

@@ -562,7 +576,7 @@ public static Image CalcDiffMaskImage(Image actual, Image expected, ResizeOption
562576
actualRgb24 = ToRgb24Image(actual, out ownsActual);
563577
expectedRgb24 = ToRgb24Image(expected, out ownsExpected);
564578

565-
return CalcDiffMaskImage(actualRgb24, expectedRgb24, resizeOption);
579+
return CalcDiffMaskImage(actualRgb24, expectedRgb24, resizeOption, pixelColorShiftTolerance);
566580
}
567581
finally
568582
{
@@ -584,8 +598,9 @@ public static Image CalcDiffMaskImage(Image actual, Image expected, ResizeOption
584598
/// <param name="expected"></param>
585599
/// <param name="mask"></param>
586600
/// <param name="resizeOption"></param>
601+
/// <param name="pixelColorShiftTolerance"></param>
587602
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
588-
public static Image CalcDiffMaskImage(Image actual, Image expected, Image mask, ResizeOption resizeOption = ResizeOption.DontResize)
603+
public static Image CalcDiffMaskImage(Image actual, Image expected, Image mask, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
589604
{
590605
ArgumentNullException.ThrowIfNull(actual);
591606
ArgumentNullException.ThrowIfNull(expected);
@@ -603,7 +618,7 @@ public static Image CalcDiffMaskImage(Image actual, Image expected, Image mask,
603618
expectedRgb24 = ToRgb24Image(expected, out ownsExpected);
604619
maskRgb24 = ToRgb24Image(mask, out ownsMask);
605620

606-
return CalcDiffMaskImage(actualRgb24, expectedRgb24, maskRgb24, resizeOption);
621+
return CalcDiffMaskImage(actualRgb24, expectedRgb24, maskRgb24, resizeOption, pixelColorShiftTolerance);
607622
}
608623
finally
609624
{
@@ -628,8 +643,9 @@ public static Image CalcDiffMaskImage(Image actual, Image expected, Image mask,
628643
/// <param name="actual"></param>
629644
/// <param name="expected"></param>
630645
/// <param name="resizeOption"></param>
646+
/// <param name="pixelColorShiftTolerance"></param>
631647
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
632-
public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected, ResizeOption resizeOption = ResizeOption.DontResize)
648+
public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
633649
{
634650
var imagesHAveSameDimension = ImagesHaveSameDimension(actual, expected);
635651

@@ -665,7 +681,7 @@ public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected
665681
var grown = GrowToSameDimension(actual, expected);
666682
try
667683
{
668-
return CalcDiffMaskImage(grown.Item1, grown.Item2, ResizeOption.DontResize);
684+
return CalcDiffMaskImage(grown.Item1, grown.Item2, ResizeOption.DontResize, pixelColorShiftTolerance);
669685
}
670686
finally
671687
{
@@ -681,8 +697,9 @@ public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected
681697
/// <param name="expected"></param>
682698
/// <param name="mask"></param>
683699
/// <param name="resizeOption"></param>
700+
/// <param name="pixelColorShiftTolerance"></param>
684701
/// <returns>Image representing diff, black means no diff between actual image and expected image, white means max diff</returns>
685-
public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24> mask, ResizeOption resizeOption = ResizeOption.DontResize)
702+
public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected, Image<Rgb24> mask, ResizeOption resizeOption = ResizeOption.DontResize, int pixelColorShiftTolerance = 0)
686703
{
687704
ArgumentNullException.ThrowIfNull(mask);
688705
var imagesHaveSameDimensions = ImagesHaveSameDimension(actual, expected) && ImagesHaveSameDimension(actual, mask);
@@ -719,7 +736,7 @@ public static Image CalcDiffMaskImage(Image<Rgb24> actual, Image<Rgb24> expected
719736
var grown = GrowToSameDimension(actual, expected, mask);
720737
try
721738
{
722-
return CalcDiffMaskImage(grown.Item1, grown.Item2, grown.Item3, ResizeOption.DontResize);
739+
return CalcDiffMaskImage(grown.Item1, grown.Item2, grown.Item3, ResizeOption.DontResize, pixelColorShiftTolerance );
723740
}
724741
finally
725742
{

ImageSharpCompare/ImageSharpCompare.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
<ItemGroup>
4747
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
4848
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="8.0.0" PrivateAssets="all" />
49-
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.12.0.78982">
49+
<PackageReference Include="SonarAnalyzer.CSharp" Version="9.17.0.82934">
5050
<PrivateAssets>all</PrivateAssets>
5151
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
5252
</PackageReference>

0 commit comments

Comments
 (0)