// Copyright (c) Six Labors. // Licensed under the Six Labors Split License. using ImageMagick; using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; public static class ImageComparingUtils { public static void CompareWithReferenceDecoder( TestImageProvider provider, Image image, bool useExactComparer = true, float compareTolerance = 0.01f) where TPixel : unmanaged, ImageSharp.PixelFormats.IPixel { string path = TestImageProvider.GetFilePathOrNull(provider) ?? throw new InvalidOperationException("CompareToOriginal() works only with file providers!"); TestFile testFile = TestFile.Create(path); using Image magickImage = DecodeWithMagick(new FileInfo(testFile.FullPath)); if (useExactComparer) { ImageComparer.Exact.VerifySimilarity(magickImage, image); } else { ImageComparer.Tolerant(compareTolerance).VerifySimilarity(magickImage, image); } } public static Image DecodeWithMagick(FileInfo fileInfo) where TPixel : unmanaged, ImageSharp.PixelFormats.IPixel { Configuration configuration = Configuration.Default.Clone(); configuration.PreferContiguousImageBuffers = true; using MagickImage magickImage = new(fileInfo); magickImage.AutoOrient(); Image result = new(configuration, (int)magickImage.Width, (int)magickImage.Height); Assert.True(result.DangerousTryGetSinglePixelMemory(out Memory resultPixels)); using (IUnsafePixelCollection pixels = magickImage.GetPixelsUnsafe()) { byte[] data = pixels.ToByteArray(PixelMapping.RGBA); PixelOperations.Instance.FromRgba32Bytes( configuration, data, resultPixels.Span, resultPixels.Length); } return result; } }