From 6ab7954bfd30d9ce5e383ab8c58a9b9dae47ff49 Mon Sep 17 00:00:00 2001 From: Anton Firszov Date: Thu, 22 Feb 2018 14:46:07 +0100 Subject: [PATCH] MakeOpaque + fixing BmpEncoderTests --- .../Processing/ColorMatrix/Opacity.cs | 4 +- .../Formats/Bmp/BmpEncoderTests.cs | 6 ++- .../Formats/Jpg/JpegEncoderTests.cs | 2 +- .../Formats/Png/PngEncoderTests.cs | 21 ++++----- .../TestUtilities/TestImageExtensions.cs | 45 +++++++++++++++---- .../Tests/ReferenceCodecTests.cs | 6 +-- 6 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/ImageSharp/Processing/ColorMatrix/Opacity.cs b/src/ImageSharp/Processing/ColorMatrix/Opacity.cs index b310b4b915..b59c068905 100644 --- a/src/ImageSharp/Processing/ColorMatrix/Opacity.cs +++ b/src/ImageSharp/Processing/ColorMatrix/Opacity.cs @@ -14,7 +14,7 @@ namespace SixLabors.ImageSharp public static partial class ImageExtensions { /// - /// Alters the alpha component of the image. + /// Multiplies the alpha component of the image. /// /// The pixel format. /// The image this method extends. @@ -25,7 +25,7 @@ namespace SixLabors.ImageSharp => source.ApplyProcessor(new OpacityProcessor(amount)); /// - /// Alters the alpha component of the image. + /// Multiplies the alpha component of the image. /// /// The pixel format. /// The image this method extends. diff --git a/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs index b1eea79d80..362df2be68 100644 --- a/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Bmp/BmpEncoderTests.cs @@ -51,13 +51,15 @@ namespace SixLabors.ImageSharp.Tests TestBmpEncoderCore(provider, bitsPerPixel); } + + private static void TestBmpEncoderCore(TestImageProvider provider, BmpBitsPerPixel bitsPerPixel) where TPixel : struct, IPixel - { + { using (Image image = provider.GetImage()) { // there is no alpha in bmp! - image.Mutate(c => c.Opacity(1)); + image.Mutate(c => c.MakeOpaque()); var encoder = new BmpEncoder { BitsPerPixel = bitsPerPixel }; diff --git a/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs index 8610356b56..10657ea78f 100644 --- a/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Jpg/JpegEncoderTests.cs @@ -80,7 +80,7 @@ namespace SixLabors.ImageSharp.Tests.Formats.Jpg using (Image image = provider.GetImage()) { // There is no alpha in Jpeg! - image.Mutate(c => c.Opacity(1)); + image.Mutate(c => c.MakeOpaque()); var encoder = new JpegEncoder() { diff --git a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs index 28f156279c..c4f9b0debb 100644 --- a/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs +++ b/tests/ImageSharp.Tests/Formats/Png/PngEncoderTests.cs @@ -123,26 +123,27 @@ namespace SixLabors.ImageSharp.Tests { if (!HasAlpha(pngColorType)) { - image.Mutate(c => c.Opacity(1)); + image.Mutate(c => c.MakeOpaque()); } var encoder = new PngEncoder { PngColorType = pngColorType, CompressionLevel = compressionLevel}; - string pngColorTypeInfo = appendPixelType ? pngColorType.ToString() : ""; + string pngColorTypeInfo = appendPngColorType ? pngColorType.ToString() : ""; string compressionLevelInfo = appendCompressionLevel ? $"_C{compressionLevel}" : ""; string debugInfo = $"{pngColorTypeInfo}{compressionLevelInfo}"; - string referenceInfo = $"{pngColorTypeInfo}"; - + // Does DebugSave & load reference CompareToReferenceInput(): - string path = ((ITestImageProvider)provider).Utility.SaveTestOutputFile(image, "png", encoder, debugInfo, appendPixelType); + string actualOutputFile = ((ITestImageProvider)provider).Utility.SaveTestOutputFile(image, "png", encoder, debugInfo, appendPixelType); - IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(path); - string referenceOutputFile = ((ITestImageProvider)provider).Utility.GetReferenceOutputFileName("png", referenceInfo, appendPixelType); + IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(actualOutputFile); - using (var encodedImage = Image.Load(referenceOutputFile, referenceDecoder)) + using (var actualImage = Image.Load(actualOutputFile, referenceDecoder)) { - ImageComparer comparer = pngColorType== PngColorType.Palette ? ImageComparer.Tolerant(ToleranceThresholdForPaletteEncoder) : ImageComparer.Exact; - comparer.CompareImagesOrFrames(image, encodedImage); + ImageComparer comparer = pngColorType == PngColorType.Palette + ? ImageComparer.Tolerant(ToleranceThresholdForPaletteEncoder) + : ImageComparer.Exact; + + comparer.VerifySimilarity(image, actualImage); } } } diff --git a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs index 33dbc911e4..6f15cf439e 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs @@ -22,6 +22,38 @@ namespace SixLabors.ImageSharp.Tests public static class TestImageExtensions { + /// + /// TODO: This should be a common processing method! The image.Opacity(val) multiplies the alpha channel! + /// + /// + /// + public static void MakeOpaque(this IImageProcessingContext ctx) + where TPixel : struct, IPixel + { + ctx.Apply( + img => + { + using (var temp = new Buffer2D(img.Width, img.Height)) + { + Span tempSpan = temp.Span; + foreach (ImageFrame frame in img.Frames) + { + Span pixelSpan = frame.GetPixelSpan(); + + PixelOperations.Instance.ToVector4(pixelSpan, tempSpan, pixelSpan.Length); + + for (int i = 0; i < tempSpan.Length; i++) + { + ref Vector4 v = ref tempSpan[i]; + v.W = 1.0f; + } + + PixelOperations.Instance.PackFromVector4(tempSpan, pixelSpan, pixelSpan.Length); + } + } + }); + } + /// /// Saves the image only when not running in the CI server. /// @@ -357,18 +389,13 @@ namespace SixLabors.ImageSharp.Tests ) where TPixel : struct, IPixel { + string actualOutputFile = provider.Utility.SaveTestOutputFile(image, extension, encoder, testOutputDetails, appendPixelTypeToFileName); + IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(actualOutputFile); - provider.Utility.SaveTestOutputFile(image, extension, encoder, testOutputDetails, appendPixelTypeToFileName); - - referenceImageExtension = referenceImageExtension ?? extension; - string referenceOutputFile = provider.Utility.GetReferenceOutputFileName(referenceImageExtension, testOutputDetails, appendPixelTypeToFileName); - - IImageDecoder referenceDecoder = TestEnvironment.GetReferenceDecoder(referenceOutputFile); - - using (var encodedImage = Image.Load(referenceOutputFile, referenceDecoder)) + using (var actualImage = Image.Load(actualOutputFile, referenceDecoder)) { ImageComparer comparer = customComparer ?? ImageComparer.Exact; - comparer.CompareImagesOrFrames(image, encodedImage); + comparer.VerifySimilarity(actualImage, image); } } diff --git a/tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs b/tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs index dde34fcc43..c67e4e06bf 100644 --- a/tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs +++ b/tests/ImageSharp.Tests/TestUtilities/Tests/ReferenceCodecTests.cs @@ -56,7 +56,7 @@ namespace SixLabors.ImageSharp.Tests { if (pngColorType != PngColorType.RgbWithAlpha) { - sourceImage.Mutate(c => c.Opacity(1)); + sourceImage.Mutate(c => c.MakeOpaque()); } var encoder = new PngEncoder() { PngColorType = pngColorType }; @@ -93,12 +93,12 @@ namespace SixLabors.ImageSharp.Tests using (Image original = provider.GetImage()) { - original.Mutate(c => c.Opacity(1)); + original.Mutate(c => c.MakeOpaque()); using (var sdBitmap = new System.Drawing.Bitmap(path)) { using (Image resaved = SystemDrawingBridge.FromFromRgb24SystemDrawingBitmap(sdBitmap)) { - resaved.Mutate(c => c.Opacity(1)); + resaved.Mutate(c => c.MakeOpaque()); ImageComparer comparer = ImageComparer.Exact; comparer.VerifySimilarity(original, resaved); }