diff --git a/ImageSharp.sln.DotSettings b/ImageSharp.sln.DotSettings
index 8e7b5dd48..526817242 100644
--- a/ImageSharp.sln.DotSettings
+++ b/ImageSharp.sln.DotSettings
@@ -388,4 +388,5 @@
True
True
True
+ True
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs
index e99f504b4..0aee0b483 100644
--- a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs
+++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor.cs
@@ -1,59 +1,34 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using System;
-using SixLabors.ImageSharp.Advanced;
using SixLabors.ImageSharp.PixelFormats;
-using SixLabors.Primitives;
namespace SixLabors.ImageSharp.Processing.Processors.Quantization
{
///
- /// Enables the quantization of images to reduce the number of colors used in the image palette.
+ /// Defines quantization processing for images to reduce the number of colors used in the image palette.
///
- /// The pixel format.
- internal class QuantizeProcessor : ImageProcessor
- where TPixel : struct, IPixel
+ public class QuantizeProcessor : IImageProcessor
{
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
- /// The quantizer used to reduce the color palette
+ /// The quantizer used to reduce the color palette.
public QuantizeProcessor(IQuantizer quantizer)
{
- Guard.NotNull(quantizer, nameof(quantizer));
this.Quantizer = quantizer;
}
///
- /// Gets the quantizer
+ /// Gets the quantizer.
///
public IQuantizer Quantizer { get; }
///
- protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ public IImageProcessor CreatePixelSpecificProcessor()
+ where TPixel : struct, IPixel
{
- using (IFrameQuantizer executor = this.Quantizer.CreateFrameQuantizer(configuration))
- using (QuantizedFrame quantized = executor.QuantizeFrame(source))
- {
- int paletteCount = quantized.Palette.Length - 1;
-
- // Not parallel to remove "quantized" closure allocation.
- // We can operate directly on the source here as we've already read it to get the
- // quantized result
- for (int y = 0; y < source.Height; y++)
- {
- Span row = source.GetPixelRowSpan(y);
- ReadOnlySpan quantizedPixelSpan = quantized.GetPixelSpan();
- int yy = y * source.Width;
-
- for (int x = 0; x < source.Width; x++)
- {
- int i = x + yy;
- row[x] = quantized.Palette[Math.Min(paletteCount, quantizedPixelSpan[i])];
- }
- }
- }
+ return new QuantizeProcessor(this.Quantizer);
}
}
}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs
new file mode 100644
index 000000000..b52343a2a
--- /dev/null
+++ b/src/ImageSharp/Processing/Processors/Quantization/QuantizeProcessor{TPixel}.cs
@@ -0,0 +1,57 @@
+// Copyright (c) Six Labors and contributors.
+// Licensed under the Apache License, Version 2.0.
+
+using System;
+
+using SixLabors.ImageSharp.Advanced;
+using SixLabors.ImageSharp.PixelFormats;
+using SixLabors.Primitives;
+
+namespace SixLabors.ImageSharp.Processing.Processors.Quantization
+{
+ ///
+ /// Enables the quantization of images to reduce the number of colors used in the image palette.
+ ///
+ /// The pixel format.
+ internal class QuantizeProcessor : ImageProcessor
+ where TPixel : struct, IPixel
+ {
+ private readonly IQuantizer quantizer;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The quantizer used to reduce the color palette.
+ public QuantizeProcessor(IQuantizer quantizer)
+ {
+ Guard.NotNull(quantizer, nameof(quantizer));
+ this.quantizer = quantizer;
+ }
+
+ ///
+ protected override void OnFrameApply(ImageFrame source, Rectangle sourceRectangle, Configuration configuration)
+ {
+ using (IFrameQuantizer executor = this.quantizer.CreateFrameQuantizer(configuration))
+ using (QuantizedFrame quantized = executor.QuantizeFrame(source))
+ {
+ int paletteCount = quantized.Palette.Length - 1;
+
+ // Not parallel to remove "quantized" closure allocation.
+ // We can operate directly on the source here as we've already read it to get the
+ // quantized result
+ for (int y = 0; y < source.Height; y++)
+ {
+ Span row = source.GetPixelRowSpan(y);
+ ReadOnlySpan quantizedPixelSpan = quantized.GetPixelSpan();
+ int yy = y * source.Width;
+
+ for (int x = 0; x < source.Width; x++)
+ {
+ int i = x + yy;
+ row[x] = quantized.Palette[Math.Min(paletteCount, quantizedPixelSpan[i])];
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/ImageSharp/Processing/QuantizeExtensions.cs b/src/ImageSharp/Processing/QuantizeExtensions.cs
index ad351afa9..3410ee6be 100644
--- a/src/ImageSharp/Processing/QuantizeExtensions.cs
+++ b/src/ImageSharp/Processing/QuantizeExtensions.cs
@@ -1,7 +1,6 @@
// Copyright (c) Six Labors and contributors.
// Licensed under the Apache License, Version 2.0.
-using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing.Processors.Quantization;
namespace SixLabors.ImageSharp.Processing
@@ -15,22 +14,18 @@ namespace SixLabors.ImageSharp.Processing
///
/// Applies quantization to the image using the .
///
- /// The pixel format.
/// The image this method extends.
/// The to allow chaining of operations.
- public static IImageProcessingContext Quantize(this IImageProcessingContext source)
- where TPixel : struct, IPixel
- => Quantize(source, KnownQuantizers.Octree);
+ public static IImageProcessingContext Quantize(this IImageProcessingContext source) =>
+ Quantize(source, KnownQuantizers.Octree);
///
/// Applies quantization to the image.
///
- /// The pixel format.
/// The image this method extends.
/// The quantizer to apply to perform the operation.
/// The to allow chaining of operations.
- public static IImageProcessingContext Quantize(this IImageProcessingContext source, IQuantizer quantizer)
- where TPixel : struct, IPixel
- => source.ApplyProcessor(new QuantizeProcessor(quantizer));
+ public static IImageProcessingContext Quantize(this IImageProcessingContext source, IQuantizer quantizer) =>
+ source.ApplyProcessor(new QuantizeProcessor(quantizer));
}
}
\ No newline at end of file