public static void VerifySimilarity <TPixelA, TPixelB>(
            this ImageComparer comparer,
            Image <TPixelA> expected,
            Image <TPixelB> actual)
            where TPixelA : unmanaged, IPixel <TPixelA>
            where TPixelB : unmanaged, IPixel <TPixelB>
        {
            if (expected.Size() != actual.Size())
            {
                throw new ImageDimensionsMismatchException(expected.Size(), actual.Size());
            }

            if (expected.Frames.Count != actual.Frames.Count)
            {
                throw new ImagesSimilarityException("Image frame count does not match!");
            }

            ImageSimilarityReport report = comparer.CompareImages(expected, actual);

            if ((report.TotalNormalizedDifference ?? 0F) != 0F)
            {
                throw new ImagesSimilarityException(report.ToString());
            }
        }
        public static void VerifySimilarityIgnoreRegion <TPixelA, TPixelB>(
            this ImageComparer comparer,
            Image <TPixelA> expected,
            Image <TPixelB> actual,
            Rectangle ignoredRegion)
            where TPixelA : unmanaged, IPixel <TPixelA>
            where TPixelB : unmanaged, IPixel <TPixelB>
        {
            if (expected.Size() != actual.Size())
            {
                throw new ImageDimensionsMismatchException(expected.Size(), actual.Size());
            }

            if (expected.Frames.Count != actual.Frames.Count)
            {
                throw new ImagesSimilarityException("Image frame count does not match!");
            }

            ImageSimilarityReport report = comparer.CompareImages(expected, actual);

            if ((report.TotalNormalizedDifference ?? 0F) != 0F)
            {
                IEnumerable <PixelDifference> outsideChanges = report.Differences.Where(
                    x =>
                    !(ignoredRegion.X <= x.Position.X &&
                      x.Position.X <= ignoredRegion.Right &&
                      ignoredRegion.Y <= x.Position.Y &&
                      x.Position.Y <= ignoredRegion.Bottom));

                if (outsideChanges.Any())
                {
                    var cleanedReport = new ImageSimilarityReport <TPixelA, TPixelB>(expected, actual, outsideChanges, null);
                    throw new ImagesSimilarityException(cleanedReport.ToString());
                }
            }
        }
 public static ImageSimilarityReport <TPixelA, TPixelB> CompareImages <TPixelA, TPixelB>(
     this ImageComparer comparer,
     Image <TPixelA> expected,
     Image <TPixelB> actual)
     where TPixelA : unmanaged, IPixel <TPixelA>
     where TPixelB : unmanaged, IPixel <TPixelB> => comparer.CompareImages(expected, actual);