@@ -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 {
0 commit comments