From c98ea13710ab210c312697bef969ba70dc0abe21 Mon Sep 17 00:00:00 2001 From: James Jackson-South Date: Sat, 15 Feb 2020 22:37:37 +1100 Subject: [PATCH] Add bounded quantization and update namings. --- .../Extensions/Dithering/DitherExtensions.cs | 2 +- .../Quantization/QuantizeExtensions.cs | 27 ++- .../{KnownDitherers.cs => KnownDitherings.cs} | 4 +- ...mal-parallel-error-diffusion-dithering.pdf | Bin 0 -> 130235 bytes .../Quantization/FrameQuantizer{TPixel}.cs | 18 +- .../OctreeFrameQuantizer{TPixel}.cs | 161 +++++++++++------- .../Quantization/OctreeQuantizer.cs | 4 +- .../Quantization/PaletteQuantizer.cs | 4 +- .../Quantization/QuantizeProcessor{TPixel}.cs | 12 +- .../Quantization/WuFrameQuantizer{TPixel}.cs | 19 +-- .../Processors/Quantization/WuQuantizer.cs | 4 +- .../ImageSharp.Benchmarks/Samplers/Diffuse.cs | 2 +- .../Processing/Dithering/DitherTest.cs | 4 +- .../Binarization/BinaryDitherTests.cs | 30 ++-- .../Processors/Dithering/DitherTests.cs | 30 ++-- .../Quantization/OctreeQuantizerTests.cs | 19 ++- .../Quantization/PaletteQuantizerTests.cs | 19 ++- .../Processors/Quantization/QuantizerTests.cs | 73 ++++++++ .../Quantization/WuQuantizerTests.cs | 19 ++- .../TestUtilities/TestImageExtensions.cs | 4 +- .../TestUtilities/TestUtils.cs | 5 +- 21 files changed, 298 insertions(+), 162 deletions(-) rename src/ImageSharp/Processing/{KnownDitherers.cs => KnownDitherings.cs} (96%) create mode 100644 src/ImageSharp/Processing/Processors/Dithering/optimal-parallel-error-diffusion-dithering.pdf create mode 100644 tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs diff --git a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs index 516bd5545..ebd2ea613 100644 --- a/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Dithering/DitherExtensions.cs @@ -18,7 +18,7 @@ namespace SixLabors.ImageSharp.Processing /// The image this method extends. /// The to allow chaining of operations. public static IImageProcessingContext Dither(this IImageProcessingContext source) => - Dither(source, KnownDitherers.BayerDither4x4); + Dither(source, KnownDitherings.BayerDither4x4); /// /// Dithers the image reducing it to a web-safe palette using ordered dithering. diff --git a/src/ImageSharp/Processing/Extensions/Quantization/QuantizeExtensions.cs b/src/ImageSharp/Processing/Extensions/Quantization/QuantizeExtensions.cs index 3410ee6be..86ccddd85 100644 --- a/src/ImageSharp/Processing/Extensions/Quantization/QuantizeExtensions.cs +++ b/src/ImageSharp/Processing/Extensions/Quantization/QuantizeExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Six Labors and contributors. +// Copyright (c) Six Labors and contributors. // Licensed under the Apache License, Version 2.0. using SixLabors.ImageSharp.Processing.Processors.Quantization; @@ -27,5 +27,28 @@ namespace SixLabors.ImageSharp.Processing /// The to allow chaining of operations. public static IImageProcessingContext Quantize(this IImageProcessingContext source, IQuantizer quantizer) => source.ApplyProcessor(new QuantizeProcessor(quantizer)); + + /// + /// Applies quantization to the image using the . + /// + /// The image this method extends. + /// + /// The structure that specifies the portion of the image object to alter. + /// + /// The to allow chaining of operations. + public static IImageProcessingContext Quantize(this IImageProcessingContext source, Rectangle rectangle) => + Quantize(source, KnownQuantizers.Octree, rectangle); + + /// + /// Applies quantization to the image. + /// + /// The image this method extends. + /// The quantizer to apply to perform the operation. + /// + /// The structure that specifies the portion of the image object to alter. + /// + /// The to allow chaining of operations. + public static IImageProcessingContext Quantize(this IImageProcessingContext source, IQuantizer quantizer, Rectangle rectangle) => + source.ApplyProcessor(new QuantizeProcessor(quantizer), rectangle); } -} \ No newline at end of file +} diff --git a/src/ImageSharp/Processing/KnownDitherers.cs b/src/ImageSharp/Processing/KnownDitherings.cs similarity index 96% rename from src/ImageSharp/Processing/KnownDitherers.cs rename to src/ImageSharp/Processing/KnownDitherings.cs index 8e3653b52..43387c55e 100644 --- a/src/ImageSharp/Processing/KnownDitherers.cs +++ b/src/ImageSharp/Processing/KnownDitherings.cs @@ -6,9 +6,9 @@ using SixLabors.ImageSharp.Processing.Processors.Dithering; namespace SixLabors.ImageSharp.Processing { /// - /// Contains reusable static instances of known ordered dither matrices + /// Contains reusable static instances of known dithering algorithms. /// - public static class KnownDitherers + public static class KnownDitherings { /// /// Gets the order ditherer using the 2x2 Bayer dithering matrix diff --git a/src/ImageSharp/Processing/Processors/Dithering/optimal-parallel-error-diffusion-dithering.pdf b/src/ImageSharp/Processing/Processors/Dithering/optimal-parallel-error-diffusion-dithering.pdf new file mode 100644 index 0000000000000000000000000000000000000000..42fb22c959e283b5e494a23f229a5f03a65e108b GIT binary patch literal 130235 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 literal 0 HcmV?d00001 diff --git a/src/ImageSharp/Processing/Processors/Quantization/FrameQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/FrameQuantizer{TPixel}.cs index f8ae64d95..1914ed891 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/FrameQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/FrameQuantizer{TPixel}.cs @@ -182,16 +182,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization if (this.Dither.DitherType == DitherType.ErrorDiffusion) { int width = bounds.Width; + int offsetY = bounds.Top; int offsetX = bounds.Left; for (int y = bounds.Top; y < bounds.Bottom; y++) { Span row = source.GetPixelRowSpan(y); - int offset = y * width; + int rowStart = (y - offsetY) * width; for (int x = bounds.Left; x < bounds.Right; x++) { TPixel sourcePixel = row[x]; - outputSpan[offset + x - offsetX] = this.GetQuantizedColor(sourcePixel, paletteSpan, out TPixel transformed); + outputSpan[rowStart + x - offsetX] = this.GetQuantizedColor(sourcePixel, paletteSpan, out TPixel transformed); this.Dither.Dither(source, bounds, sourcePixel, transformed, x, y, bitDepth); } } @@ -255,16 +256,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization ReadOnlySpan paletteSpan = this.palette.Span; Span outputSpan = this.output.Span; int width = this.bounds.Width; + int offsetY = this.bounds.Top; int offsetX = this.bounds.Left; for (int y = rows.Min; y < rows.Max; y++) { Span row = this.source.GetPixelRowSpan(y); - int offset = y * width; + int rowStart = (y - offsetY) * width; for (int x = this.bounds.Left; x < this.bounds.Right; x++) { - outputSpan[offset + x - offsetX] = this.quantizer.GetQuantizedColor(row[x], paletteSpan, out TPixel _); + outputSpan[rowStart + x - offsetX] = this.quantizer.GetQuantizedColor(row[x], paletteSpan, out TPixel _); } } } @@ -302,18 +304,20 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization ReadOnlySpan paletteSpan = this.palette.Span; Span outputSpan = this.output.Span; int width = this.bounds.Width; + int offsetY = this.bounds.Top; + int offsetX = this.bounds.Left; IDither dither = this.quantizer.Dither; TPixel transformed = default; - int offsetX = this.bounds.Left; for (int y = rows.Min; y < rows.Max; y++) { Span row = this.source.GetPixelRowSpan(y); - int offset = y * width; + int rowStart = (y - offsetY) * width; + for (int x = this.bounds.Left; x < this.bounds.Right; x++) { TPixel dithered = dither.Dither(this.source, this.bounds, row[x], transformed, x, y, this.bitDepth); - outputSpan[offset + x - offsetX] = this.quantizer.GetQuantizedColor(dithered, paletteSpan, out TPixel _); + outputSpan[rowStart + x - offsetX] = this.quantizer.GetQuantizedColor(dithered, paletteSpan, out TPixel _); } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/OctreeFrameQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/OctreeFrameQuantizer{TPixel}.cs index 56a523f9b..b489b5e8d 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/OctreeFrameQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/OctreeFrameQuantizer{TPixel}.cs @@ -2,11 +2,12 @@ // Licensed under the Apache License, Version 2.0. using System; +using System.Buffers; using System.Collections.Generic; using System.Numerics; using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; using SixLabors.ImageSharp.Advanced; +using SixLabors.ImageSharp.Memory; using SixLabors.ImageSharp.PixelFormats; namespace SixLabors.ImageSharp.Processing.Processors.Quantization @@ -68,20 +69,21 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// protected override void FirstPass(ImageFrame source, Rectangle bounds) { + using IMemoryOwner buffer = this.Configuration.MemoryAllocator.Allocate(bounds.Width); + Span bufferSpan = buffer.GetSpan(); + // Loop through each row - int offset = bounds.Left; for (int y = bounds.Top; y < bounds.Bottom; y++) { - Span row = source.GetPixelRowSpan(y); - ref TPixel scanBaseRef = ref MemoryMarshal.GetReference(row); + Span row = source.GetPixelRowSpan(y).Slice(bounds.Left, bounds.Width); + PixelOperations.Instance.ToRgba32(this.Configuration, row, bufferSpan); - // And loop through each column - for (int x = bounds.Left; x < bounds.Right; x++) + for (int x = 0; x < bufferSpan.Length; x++) { - ref TPixel pixel = ref Unsafe.Add(ref scanBaseRef, x - offset); + Rgba32 rgba = bufferSpan[x]; // Add the color to the Octree - this.octree.AddColor(ref pixel); + this.octree.AddColor(rgba); } } } @@ -92,7 +94,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization { if (!this.DoDither) { - var index = (byte)this.octree.GetPaletteIndex(ref color); + var index = (byte)this.octree.GetPaletteIndex(color); match = palette[index]; return index; } @@ -113,10 +115,19 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization private sealed class Octree { /// - /// Mask used when getting the appropriate pixels for a given node + /// Mask used when getting the appropriate pixels for a given node. /// - // ReSharper disable once StaticMemberInGenericType - private static readonly int[] Mask = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 }; + private static readonly byte[] Mask = new byte[] + { + 0b10000000, + 0b1000000, + 0b100000, + 0b10000, + 0b1000, + 0b100, + 0b10, + 0b1 + }; /// /// The root of the Octree @@ -136,7 +147,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// /// Cache the previous color quantized /// - private TPixel previousColor; + private Rgba32 previousColor; /// /// Initializes a new instance of the class. @@ -178,29 +189,30 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// /// Add a given color value to the Octree /// - /// The pixel data. - public void AddColor(ref TPixel pixel) + /// The color to add. + public void AddColor(Rgba32 color) { // Check if this request is for the same color as the last - if (this.previousColor.Equals(pixel)) + if (this.previousColor.Equals(color)) { - // If so, check if I have a previous node setup. This will only occur if the first color in the image + // If so, check if I have a previous node setup. + // This will only occur if the first color in the image // happens to be black, with an alpha component of zero. if (this.previousNode is null) { - this.previousColor = pixel; - this.root.AddColor(ref pixel, this.maxColorBits, 0, this); + this.previousColor = color; + this.root.AddColor(ref color, this.maxColorBits, 0, this); } else { // Just update the previous node - this.previousNode.Increment(ref pixel); + this.previousNode.Increment(ref color); } } else { - this.previousColor = pixel; - this.root.AddColor(ref pixel, this.maxColorBits, 0, this); + this.previousColor = color; + this.root.AddColor(ref color, this.maxColorBits, 0, this); } } @@ -232,12 +244,17 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// /// Get the palette index for the passed color /// - /// The pixel data. + /// The color to match. /// - /// The . + /// The index. /// [MethodImpl(InliningOptions.ShortMethod)] - public int GetPaletteIndex(ref TPixel pixel) => this.root.GetPaletteIndex(ref pixel, 0); + public int GetPaletteIndex(TPixel color) + { + Rgba32 rgba = default; + color.ToRgba32(ref rgba); + return this.root.GetPaletteIndex(ref rgba, 0); + } /// /// Keep track of the previous node that was quantized @@ -360,16 +377,16 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// /// Add a color into the tree /// - /// The pixel color - /// The number of significant color bits - /// The level in the tree - /// The tree to which this node belongs - public void AddColor(ref TPixel pixel, int colorBits, int level, Octree octree) + /// The color to add. + /// The number of significant color bits. + /// The level in the tree. + /// The tree to which this node belongs. + public void AddColor(ref Rgba32 color, int colorBits, int level, Octree octree) { // Update the color information if this is a leaf if (this.leaf) { - this.Increment(ref pixel); + this.Increment(ref color); // Setup the previous node octree.TrackPrevious(this); @@ -377,13 +394,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization else { // Go to the next level down in the tree - int shift = 7 - level; - Rgba32 rgba = default; - pixel.ToRgba32(ref rgba); - - int index = ((rgba.B & Mask[level]) >> (shift - 2)) - | ((rgba.G & Mask[level]) >> (shift - 1)) - | ((rgba.R & Mask[level]) >> shift); + int index = GetColorIndex(ref color, level); OctreeNode child = this.children[index]; if (child is null) @@ -394,7 +405,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization } // Add the color to the child node - child.AddColor(ref pixel, colorBits, level + 1, octree); + child.AddColor(ref color, colorBits, level + 1, octree); } } @@ -467,29 +478,35 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// The representing the index of the pixel in the palette. /// [MethodImpl(InliningOptions.ColdPath)] - public int GetPaletteIndex(ref TPixel pixel, int level) + public int GetPaletteIndex(ref Rgba32 pixel, int level) { - int index = this.paletteIndex; - - if (!this.leaf) + if (this.leaf) { - int shift = 7 - level; - Rgba32 rgba = default; - pixel.ToRgba32(ref rgba); + return this.paletteIndex; + } - int pixelIndex = ((rgba.B & Mask[level]) >> (shift - 2)) - | ((rgba.G & Mask[level]) >> (shift - 1)) - | ((rgba.R & Mask[level]) >> shift); + int colorIndex = GetColorIndex(ref pixel, level); + OctreeNode child = this.children[colorIndex]; - OctreeNode child = this.children[pixelIndex]; - if (child != null) - { - index = child.GetPaletteIndex(ref pixel, level + 1); - } - else + int index = 0; + if (child != null) + { + index = child.GetPaletteIndex(ref pixel, level + 1); + } + else + { + // Check other children. + for (int i = 0; i < this.children.Length; i++) { - // TODO: Throw helper. - throw new Exception($"Cannot retrieve a pixel at the given index {pixelIndex}."); + child = this.children[i]; + if (child != null) + { + var childIndex = child.GetPaletteIndex(ref pixel, level + 1); + if (childIndex != 0) + { + return childIndex; + } + } } } @@ -497,18 +514,32 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization } /// - /// Increment the pixel count and add to the color information + /// Gets the color index at the given level. + /// + /// The color. + /// The node level. + /// The index. + [MethodImpl(InliningOptions.ShortMethod)] + private static int GetColorIndex(ref Rgba32 color, int level) + { + int shift = 7 - level; + byte mask = Mask[level]; + return ((color.B & mask) >> (shift - 2)) + | ((color.G & mask) >> (shift - 1)) + | ((color.R & mask) >> shift); + } + + /// + /// Increment the color count and add to the color information /// - /// The pixel to add. + /// The pixel to add. [MethodImpl(InliningOptions.ShortMethod)] - public void Increment(ref TPixel pixel) + public void Increment(ref Rgba32 color) { - Rgba32 rgba = default; - pixel.ToRgba32(ref rgba); this.pixelCount++; - this.red += rgba.R; - this.green += rgba.G; - this.blue += rgba.B; + this.red += color.R; + this.green += color.G; + this.blue += color.B; } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer.cs b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer.cs index 2aad3c43d..06578354c 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/OctreeQuantizer.cs @@ -10,7 +10,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// Allows the quantization of images pixels using Octrees. /// /// - /// By default the quantizer uses dithering and a color palette of a maximum length of 255 + /// By default the quantizer uses dithering and a color palette of a maximum length of 255 /// /// public class OctreeQuantizer : IQuantizer @@ -93,6 +93,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization return new OctreeFrameQuantizer(configuration, this, maxColors); } - private static IDither GetDiffuser(bool dither) => dither ? KnownDitherers.FloydSteinberg : null; + private static IDither GetDiffuser(bool dither) => dither ? KnownDitherings.FloydSteinberg : null; } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/PaletteQuantizer.cs b/src/ImageSharp/Processing/Processors/Quantization/PaletteQuantizer.cs index daba7a6b7..fd2e6052e 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/PaletteQuantizer.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/PaletteQuantizer.cs @@ -12,7 +12,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// Allows the quantization of images pixels using color palettes. /// Override this class to provide your own palette. /// - /// By default the quantizer uses dithering. + /// By default the quantizer uses dithering. /// /// public class PaletteQuantizer : IQuantizer @@ -76,6 +76,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization return new PaletteFrameQuantizer(configuration, this.Dither, palette); } - private static IDither GetDiffuser(bool dither) => dither ? KnownDitherers.FloydSteinberg : null; + private static IDither GetDiffuser(bool dither) => dither ? KnownDitherings.FloydSteinberg : null; } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs index b842c6362..b42e0f3e2 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs @@ -53,7 +53,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization private readonly Rectangle bounds; private readonly ImageFrame source; private readonly IQuantizedFrame quantized; - private readonly int maxPaletteIndex; [MethodImpl(InliningOptions.ShortMethod)] public RowIntervalOperation( @@ -64,7 +63,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization this.bounds = bounds; this.source = source; this.quantized = quantized; - this.maxPaletteIndex = quantized.Palette.Length - 1; } [MethodImpl(InliningOptions.ShortMethod)] @@ -72,17 +70,19 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization { ReadOnlySpan quantizedPixelSpan = this.quantized.GetPixelSpan(); ReadOnlySpan paletteSpan = this.quantized.Palette.Span; + int offsetY = this.bounds.Top; + int offsetX = this.bounds.Left; + int width = this.bounds.Width; - int offset = this.bounds.Left; for (int y = rows.Min; y < rows.Max; y++) { Span row = this.source.GetPixelRowSpan(y); - int yy = y * this.bounds.Width; + int rowStart = (y - offsetY) * width; for (int x = this.bounds.Left; x < this.bounds.Right; x++) { - int i = yy + x - offset; - row[x] = paletteSpan[Math.Min(this.maxPaletteIndex, quantizedPixelSpan[i])]; + int i = rowStart + x - offsetX; + row[x] = paletteSpan[quantizedPixelSpan[i]]; } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs index 3cf67f308..f037f63c2 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/WuFrameQuantizer{TPixel}.cs @@ -384,29 +384,24 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization Span momentSpan = this.moments.GetSpan(); // Build up the 3-D color histogram - // Loop through each row - using IMemoryOwner rgbaBuffer = this.memoryAllocator.Allocate(source.Width); - Span rgbaSpan = rgbaBuffer.GetSpan(); - ref Rgba32 scanBaseRef = ref MemoryMarshal.GetReference(rgbaSpan); + using IMemoryOwner buffer = this.memoryAllocator.Allocate(bounds.Width); + Span bufferSpan = buffer.GetSpan(); - int offset = bounds.Left; for (int y = bounds.Top; y < bounds.Bottom; y++) { - Span row = source.GetPixelRowSpan(y); - PixelOperations.Instance.ToRgba32(source.GetConfiguration(), row, rgbaSpan); + Span row = source.GetPixelRowSpan(y).Slice(bounds.Left, bounds.Width); + PixelOperations.Instance.ToRgba32(this.Configuration, row, bufferSpan); - // And loop through each column - for (int x = bounds.Left; x < bounds.Right; x++) + for (int x = 0; x < bufferSpan.Length; x++) { - ref Rgba32 rgba = ref Unsafe.Add(ref scanBaseRef, x - offset); + Rgba32 rgba = bufferSpan[x]; int r = (rgba.R >> (8 - IndexBits)) + 1; int g = (rgba.G >> (8 - IndexBits)) + 1; int b = (rgba.B >> (8 - IndexBits)) + 1; int a = (rgba.A >> (8 - IndexAlphaBits)) + 1; - int index = GetPaletteIndex(r, g, b, a); - momentSpan[index] += rgba; + momentSpan[GetPaletteIndex(r, g, b, a)] += rgba; } } } diff --git a/src/ImageSharp/Processing/Processors/Quantization/WuQuantizer.cs b/src/ImageSharp/Processing/Processors/Quantization/WuQuantizer.cs index 6bd432242..682b6ec64 100644 --- a/src/ImageSharp/Processing/Processors/Quantization/WuQuantizer.cs +++ b/src/ImageSharp/Processing/Processors/Quantization/WuQuantizer.cs @@ -9,7 +9,7 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization /// /// Allows the quantization of images pixels using Xiaolin Wu's Color Quantizer /// - /// By default the quantizer uses dithering and a color palette of a maximum length of 255 + /// By default the quantizer uses dithering and a color palette of a maximum length of 255 /// /// public class WuQuantizer : IQuantizer @@ -85,6 +85,6 @@ namespace SixLabors.ImageSharp.Processing.Processors.Quantization return new WuFrameQuantizer(configuration, this, maxColors); } - private static IDither GetDiffuser(bool dither) => dither ? KnownDitherers.FloydSteinberg : null; + private static IDither GetDiffuser(bool dither) => dither ? KnownDitherings.FloydSteinberg : null; } } diff --git a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs index feb447501..134b3091e 100644 --- a/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs +++ b/tests/ImageSharp.Benchmarks/Samplers/Diffuse.cs @@ -15,7 +15,7 @@ namespace SixLabors.ImageSharp.Benchmarks.Samplers { using (var image = new Image(Configuration.Default, 800, 800, Color.BlanchedAlmond)) { - image.Mutate(x => x.Dither(KnownDitherers.FloydSteinberg)); + image.Mutate(x => x.Dither(KnownDitherings.FloydSteinberg)); return image.Size(); } diff --git a/tests/ImageSharp.Tests/Processing/Dithering/DitherTest.cs b/tests/ImageSharp.Tests/Processing/Dithering/DitherTest.cs index 3b04f216c..f343d9266 100644 --- a/tests/ImageSharp.Tests/Processing/Dithering/DitherTest.cs +++ b/tests/ImageSharp.Tests/Processing/Dithering/DitherTest.cs @@ -29,8 +29,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Binarization public DitherTest() { - this.orderedDither = KnownDitherers.BayerDither4x4; - this.errorDiffuser = KnownDitherers.FloydSteinberg; + this.orderedDither = KnownDitherings.BayerDither4x4; + this.errorDiffuser = KnownDitherings.FloydSteinberg; } [Fact] diff --git a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs index 3b6f51a89..d57a63432 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Binarization/BinaryDitherTests.cs @@ -20,30 +20,30 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Binarization public static readonly TheoryData OrderedDitherers = new TheoryData { - { "Bayer8x8", KnownDitherers.BayerDither8x8 }, - { "Bayer4x4", KnownDitherers.BayerDither4x4 }, - { "Ordered3x3", KnownDitherers.OrderedDither3x3 }, - { "Bayer2x2", KnownDitherers.BayerDither2x2 } + { "Bayer8x8", KnownDitherings.BayerDither8x8 }, + { "Bayer4x4", KnownDitherings.BayerDither4x4 }, + { "Ordered3x3", KnownDitherings.OrderedDither3x3 }, + { "Bayer2x2", KnownDitherings.BayerDither2x2 } }; public static readonly TheoryData ErrorDiffusers = new TheoryData { - { "Atkinson", KnownDitherers.Atkinson }, - { "Burks", KnownDitherers.Burks }, - { "FloydSteinberg", KnownDitherers.FloydSteinberg }, - { "JarvisJudiceNinke", KnownDitherers.JarvisJudiceNinke }, - { "Sierra2", KnownDitherers.Sierra2 }, - { "Sierra3", KnownDitherers.Sierra3 }, - { "SierraLite", KnownDitherers.SierraLite }, - { "StevensonArce", KnownDitherers.StevensonArce }, - { "Stucki", KnownDitherers.Stucki }, + { "Atkinson", KnownDitherings.Atkinson }, + { "Burks", KnownDitherings.Burks }, + { "FloydSteinberg", KnownDitherings.FloydSteinberg }, + { "JarvisJudiceNinke", KnownDitherings.JarvisJudiceNinke }, + { "Sierra2", KnownDitherings.Sierra2 }, + { "Sierra3", KnownDitherings.Sierra3 }, + { "SierraLite", KnownDitherings.SierraLite }, + { "StevensonArce", KnownDitherings.StevensonArce }, + { "Stucki", KnownDitherings.Stucki }, }; public const PixelTypes TestPixelTypes = PixelTypes.Rgba32 | PixelTypes.Bgra32 | PixelTypes.Rgb24; - private static IDither DefaultDitherer => KnownDitherers.BayerDither4x4; + private static IDither DefaultDitherer => KnownDitherings.BayerDither4x4; - private static IDither DefaultErrorDiffuser => KnownDitherers.Atkinson; + private static IDither DefaultErrorDiffuser => KnownDitherings.Atkinson; [Theory] [WithFileCollection(nameof(CommonTestImages), nameof(OrderedDitherers), PixelTypes.Rgba32)] diff --git a/tests/ImageSharp.Tests/Processing/Processors/Dithering/DitherTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Dithering/DitherTests.cs index 0900d6956..2ce655a7e 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Dithering/DitherTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Dithering/DitherTests.cs @@ -20,31 +20,31 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Binarization public static readonly TheoryData ErrorDiffusers = new TheoryData { - KnownDitherers.Atkinson, - KnownDitherers.Burks, - KnownDitherers.FloydSteinberg, - KnownDitherers.JarvisJudiceNinke, - KnownDitherers.Sierra2, - KnownDitherers.Sierra3, - KnownDitherers.SierraLite, - KnownDitherers.StevensonArce, - KnownDitherers.Stucki, + KnownDitherings.Atkinson, + KnownDitherings.Burks, + KnownDitherings.FloydSteinberg, + KnownDitherings.JarvisJudiceNinke, + KnownDitherings.Sierra2, + KnownDitherings.Sierra3, + KnownDitherings.SierraLite, + KnownDitherings.StevensonArce, + KnownDitherings.Stucki, }; public static readonly TheoryData OrderedDitherers = new TheoryData { - KnownDitherers.BayerDither8x8, - KnownDitherers.BayerDither4x4, - KnownDitherers.OrderedDither3x3, - KnownDitherers.BayerDither2x2 + KnownDitherings.BayerDither8x8, + KnownDitherings.BayerDither4x4, + KnownDitherings.OrderedDither3x3, + KnownDitherings.BayerDither2x2 }; private static readonly ImageComparer ValidatorComparer = ImageComparer.TolerantPercentage(0.05f); - private static IDither DefaultDitherer => KnownDitherers.BayerDither4x4; + private static IDither DefaultDitherer => KnownDitherings.BayerDither4x4; - private static IDither DefaultErrorDiffuser => KnownDitherers.Atkinson; + private static IDither DefaultErrorDiffuser => KnownDitherings.Atkinson; /// /// The output is visually correct old 32bit runtime, diff --git a/tests/ImageSharp.Tests/Processing/Processors/Quantization/OctreeQuantizerTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Quantization/OctreeQuantizerTests.cs index 5ea3d7863..69a681bb3 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Quantization/OctreeQuantizerTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Quantization/OctreeQuantizerTests.cs @@ -16,19 +16,19 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization var quantizer = new OctreeQuantizer(128); Assert.Equal(128, quantizer.MaxColors); - Assert.Equal(KnownDitherers.FloydSteinberg, quantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, quantizer.Dither); quantizer = new OctreeQuantizer(false); Assert.Equal(QuantizerConstants.MaxColors, quantizer.MaxColors); Assert.Null(quantizer.Dither); - quantizer = new OctreeQuantizer(KnownDitherers.Atkinson); + quantizer = new OctreeQuantizer(KnownDitherings.Atkinson); Assert.Equal(QuantizerConstants.MaxColors, quantizer.MaxColors); - Assert.Equal(KnownDitherers.Atkinson, quantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, quantizer.Dither); - quantizer = new OctreeQuantizer(KnownDitherers.Atkinson, 128); + quantizer = new OctreeQuantizer(KnownDitherings.Atkinson, 128); Assert.Equal(128, quantizer.MaxColors); - Assert.Equal(KnownDitherers.Atkinson, quantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, quantizer.Dither); } [Fact] @@ -39,7 +39,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.FloydSteinberg, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, frameQuantizer.Dither); + frameQuantizer.Dispose(); quantizer = new OctreeQuantizer(false); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); @@ -47,12 +48,14 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.False(frameQuantizer.DoDither); Assert.Null(frameQuantizer.Dither); + frameQuantizer.Dispose(); - quantizer = new OctreeQuantizer(KnownDitherers.Atkinson); + quantizer = new OctreeQuantizer(KnownDitherings.Atkinson); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.Atkinson, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, frameQuantizer.Dither); + frameQuantizer.Dispose(); } } } diff --git a/tests/ImageSharp.Tests/Processing/Processors/Quantization/PaletteQuantizerTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Quantization/PaletteQuantizerTests.cs index 1d5c3163c..a348deb65 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Quantization/PaletteQuantizerTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Quantization/PaletteQuantizerTests.cs @@ -18,15 +18,15 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization var quantizer = new PaletteQuantizer(Rgb); Assert.Equal(Rgb, quantizer.Palette); - Assert.Equal(KnownDitherers.FloydSteinberg, quantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, quantizer.Dither); quantizer = new PaletteQuantizer(Rgb, false); Assert.Equal(Rgb, quantizer.Palette); Assert.Null(quantizer.Dither); - quantizer = new PaletteQuantizer(Rgb, KnownDitherers.Atkinson); + quantizer = new PaletteQuantizer(Rgb, KnownDitherings.Atkinson); Assert.Equal(Rgb, quantizer.Palette); - Assert.Equal(KnownDitherers.Atkinson, quantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, quantizer.Dither); } [Fact] @@ -37,7 +37,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.FloydSteinberg, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, frameQuantizer.Dither); + frameQuantizer.Dispose(); quantizer = new PaletteQuantizer(Rgb, false); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); @@ -45,26 +46,28 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.False(frameQuantizer.DoDither); Assert.Null(frameQuantizer.Dither); + frameQuantizer.Dispose(); - quantizer = new PaletteQuantizer(Rgb, KnownDitherers.Atkinson); + quantizer = new PaletteQuantizer(Rgb, KnownDitherings.Atkinson); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.Atkinson, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, frameQuantizer.Dither); + frameQuantizer.Dispose(); } [Fact] public void KnownQuantizersWebSafeTests() { IQuantizer quantizer = KnownQuantizers.WebSafe; - Assert.Equal(KnownDitherers.FloydSteinberg, quantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, quantizer.Dither); } [Fact] public void KnownQuantizersWernerTests() { IQuantizer quantizer = KnownQuantizers.Werner; - Assert.Equal(KnownDitherers.FloydSteinberg, quantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, quantizer.Dither); } } } diff --git a/tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs new file mode 100644 index 000000000..efad57d5b --- /dev/null +++ b/tests/ImageSharp.Tests/Processing/Processors/Quantization/QuantizerTests.cs @@ -0,0 +1,73 @@ +// Copyright (c) Six Labors and contributors. +// Licensed under the Apache License, Version 2.0. + +using SixLabors.ImageSharp.PixelFormats; +using SixLabors.ImageSharp.Processing; +using SixLabors.ImageSharp.Processing.Processors.Quantization; +using SixLabors.ImageSharp.Tests.TestUtilities.ImageComparison; +using Xunit; + +namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization +{ + public class QuantizerTests + { + public static readonly string[] CommonTestImages = + { + TestImages.Png.CalliphoraPartial, + TestImages.Png.Bike + }; + + public static readonly TheoryData Quantizers + = new TheoryData + { + KnownQuantizers.Octree, + KnownQuantizers.WebSafe, + KnownQuantizers.Werner, + KnownQuantizers.Wu, + new OctreeQuantizer(false), + new WebSafePaletteQuantizer(false), + new WernerPaletteQuantizer(false), + new WuQuantizer(false), + new OctreeQuantizer(KnownDitherings.BayerDither8x8), + new WebSafePaletteQuantizer(KnownDitherings.BayerDither8x8), + new WernerPaletteQuantizer(KnownDitherings.BayerDither8x8), + new WuQuantizer(KnownDitherings.BayerDither8x8) + }; + + private static readonly ImageComparer ValidatorComparer = ImageComparer.TolerantPercentage(0.05f); + + [Theory] + [WithFileCollection(nameof(CommonTestImages), nameof(Quantizers), PixelTypes.Rgba32)] + public void ApplyQuantizationInBox(TestImageProvider provider, IQuantizer quantizer) + where TPixel : struct, IPixel + { + string quantizerName = quantizer.GetType().Name; + string ditherName = quantizer.Dither?.GetType()?.Name ?? "noDither"; + string ditherType = quantizer.Dither?.DitherType.ToString() ?? string.Empty; + string testOutputDetails = $"{quantizerName}_{ditherName}_{ditherType}"; + + provider.RunRectangleConstrainedValidatingProcessorTest( + (x, rect) => x.Quantize(quantizer, rect), + comparer: ValidatorComparer, + testOutputDetails: testOutputDetails, + appendPixelTypeToFileName: false); + } + + [Theory] + [WithFileCollection(nameof(CommonTestImages), nameof(Quantizers), PixelTypes.Rgba32)] + public void ApplyQuantization(TestImageProvider provider, IQuantizer quantizer) + where TPixel : struct, IPixel + { + string quantizerName = quantizer.GetType().Name; + string ditherName = quantizer.Dither?.GetType()?.Name ?? "noDither"; + string ditherType = quantizer.Dither?.DitherType.ToString() ?? string.Empty; + string testOutputDetails = $"{quantizerName}_{ditherName}_{ditherType}"; + + provider.RunValidatingProcessorTest( + x => x.Quantize(quantizer), + comparer: ValidatorComparer, + testOutputDetails: testOutputDetails, + appendPixelTypeToFileName: false); + } + } +} diff --git a/tests/ImageSharp.Tests/Processing/Processors/Quantization/WuQuantizerTests.cs b/tests/ImageSharp.Tests/Processing/Processors/Quantization/WuQuantizerTests.cs index 08f51940d..e352d51f6 100644 --- a/tests/ImageSharp.Tests/Processing/Processors/Quantization/WuQuantizerTests.cs +++ b/tests/ImageSharp.Tests/Processing/Processors/Quantization/WuQuantizerTests.cs @@ -16,19 +16,19 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization var quantizer = new WuQuantizer(128); Assert.Equal(128, quantizer.MaxColors); - Assert.Equal(KnownDitherers.FloydSteinberg, quantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, quantizer.Dither); quantizer = new WuQuantizer(false); Assert.Equal(QuantizerConstants.MaxColors, quantizer.MaxColors); Assert.Null(quantizer.Dither); - quantizer = new WuQuantizer(KnownDitherers.Atkinson); + quantizer = new WuQuantizer(KnownDitherings.Atkinson); Assert.Equal(QuantizerConstants.MaxColors, quantizer.MaxColors); - Assert.Equal(KnownDitherers.Atkinson, quantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, quantizer.Dither); - quantizer = new WuQuantizer(KnownDitherers.Atkinson, 128); + quantizer = new WuQuantizer(KnownDitherings.Atkinson, 128); Assert.Equal(128, quantizer.MaxColors); - Assert.Equal(KnownDitherers.Atkinson, quantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, quantizer.Dither); } [Fact] @@ -39,7 +39,8 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.FloydSteinberg, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.FloydSteinberg, frameQuantizer.Dither); + frameQuantizer.Dispose(); quantizer = new WuQuantizer(false); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); @@ -47,12 +48,14 @@ namespace SixLabors.ImageSharp.Tests.Processing.Processors.Quantization Assert.NotNull(frameQuantizer); Assert.False(frameQuantizer.DoDither); Assert.Null(frameQuantizer.Dither); + frameQuantizer.Dispose(); - quantizer = new WuQuantizer(KnownDitherers.Atkinson); + quantizer = new WuQuantizer(KnownDitherings.Atkinson); frameQuantizer = quantizer.CreateFrameQuantizer(Configuration.Default); Assert.NotNull(frameQuantizer); Assert.True(frameQuantizer.DoDither); - Assert.Equal(KnownDitherers.Atkinson, frameQuantizer.Dither); + Assert.Equal(KnownDitherings.Atkinson, frameQuantizer.Dither); + frameQuantizer.Dispose(); } } } diff --git a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs index 2ef62ed1c..92e0bf85a 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestImageExtensions.cs @@ -342,10 +342,10 @@ namespace SixLabors.ImageSharp.Tests if (!File.Exists(referenceOutputFile)) { - throw new System.IO.FileNotFoundException("Reference output file missing: " + referenceOutputFile, referenceOutputFile); + throw new FileNotFoundException("Reference output file missing: " + referenceOutputFile, referenceOutputFile); } - decoder = decoder ?? TestEnvironment.GetReferenceDecoder(referenceOutputFile); + decoder ??= TestEnvironment.GetReferenceDecoder(referenceOutputFile); return Image.Load(referenceOutputFile, decoder); } diff --git a/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs b/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs index 05da31282..fd3f18359 100644 --- a/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs +++ b/tests/ImageSharp.Tests/TestUtilities/TestUtils.cs @@ -294,7 +294,8 @@ namespace SixLabors.ImageSharp.Tests this TestImageProvider provider, Action process, object testOutputDetails = null, - ImageComparer comparer = null) + ImageComparer comparer = null, + bool appendPixelTypeToFileName = true) where TPixel : struct, IPixel { if (comparer == null) @@ -307,7 +308,7 @@ namespace SixLabors.ImageSharp.Tests var bounds = new Rectangle(image.Width / 4, image.Width / 4, image.Width / 2, image.Height / 2); image.Mutate(x => process(x, bounds)); image.DebugSave(provider, testOutputDetails); - image.CompareToReferenceOutput(comparer, provider, testOutputDetails); + image.CompareToReferenceOutput(comparer, provider, testOutputDetails, appendPixelTypeToFileName: appendPixelTypeToFileName); } }