public void OctreeQuantizerConstructor() { var expected = new QuantizerOptions { MaxColors = 128 }; var quantizer = new OctreeQuantizer(expected); Assert.Equal(expected.MaxColors, quantizer.Options.MaxColors); Assert.Equal(QuantizerConstants.DefaultDither, quantizer.Options.Dither); expected = new QuantizerOptions { Dither = null }; quantizer = new OctreeQuantizer(expected); Assert.Equal(QuantizerConstants.MaxColors, quantizer.Options.MaxColors); Assert.Null(quantizer.Options.Dither); expected = new QuantizerOptions { Dither = KnownDitherings.Atkinson }; quantizer = new OctreeQuantizer(expected); Assert.Equal(QuantizerConstants.MaxColors, quantizer.Options.MaxColors); Assert.Equal(KnownDitherings.Atkinson, quantizer.Options.Dither); expected = new QuantizerOptions { Dither = KnownDitherings.Atkinson, MaxColors = 0 }; quantizer = new OctreeQuantizer(expected); Assert.Equal(QuantizerConstants.MinColors, quantizer.Options.MaxColors); Assert.Equal(KnownDitherings.Atkinson, quantizer.Options.Dither); }
private void EncodeLocal <TPixel>(Image <TPixel> image, QuantizedFrame <TPixel> quantized, Stream stream) where TPixel : unmanaged, IPixel <TPixel> { ImageFrame <TPixel> previousFrame = null; GifFrameMetadata previousMeta = null; foreach (ImageFrame <TPixel> frame in image.Frames) { ImageFrameMetadata metadata = frame.Metadata; GifFrameMetadata frameMetadata = metadata.GetGifMetadata(); if (quantized is null) { // Allow each frame to be encoded at whatever color depth the frame designates if set. if (previousFrame != null && previousMeta.ColorTableLength != frameMetadata.ColorTableLength && frameMetadata.ColorTableLength > 0) { var options = new QuantizerOptions { Dither = this.quantizer.Options.Dither, DitherScale = this.quantizer.Options.DitherScale, MaxColors = frameMetadata.ColorTableLength }; using (IFrameQuantizer <TPixel> frameQuantizer = this.quantizer.CreateFrameQuantizer <TPixel>(this.configuration, options)) { quantized = frameQuantizer.QuantizeFrame(frame, frame.Bounds()); } } else { using (IFrameQuantizer <TPixel> frameQuantizer = this.quantizer.CreateFrameQuantizer <TPixel>(this.configuration)) { quantized = frameQuantizer.QuantizeFrame(frame, frame.Bounds()); } } } this.bitDepth = ImageMaths.GetBitsNeededForColorDepth(quantized.Palette.Length).Clamp(1, 8); this.WriteGraphicalControlExtension(frameMetadata, this.GetTransparentIndex(quantized), stream); this.WriteImageDescriptor(frame, true, stream); this.WriteColorTable(quantized, stream); this.WriteImageData(quantized, stream); quantized?.Dispose(); quantized = null; // So next frame can regenerate it previousFrame = frame; previousMeta = frameMetadata; } }
// 이미지를 팔레트화시킨다. // 팔레트에는 반드시 검은색과 흰색은 빠지도록 한다. static string ExecuteQuantize(string sourceFileName, int maxColor = 30) { Logger.WriteLine($"Running {nameof(ExecuteQuantize)}"); var targetFileName = AppendToFileName(sourceFileName, "-Q"); var quOpts = new QuantizerOptions { MaxColors = maxColor }; //var quantizer = new OctreeQuantizer(quOpts); var quantizer = new WuQuantizer(quOpts); var config = Configuration.Default; var pixelQuantizer = quantizer.CreatePixelSpecificQuantizer <Rgba32>(config); using (var image = Image.Load <Rgba32>(sourceFileName)) using (var quantizedResult = pixelQuantizer.BuildPaletteAndQuantizeFrame(image.Frames[0], image.Frames[0].Bounds())) { var quantizedPalette = new List <Color>(); foreach (var p in quantizedResult.Palette.Span) { var c = new Color(p); // 팔레트에 흰색과 검은색은 반드시 빠지도록 한다. if (c != Color.White && c != Color.Black) { quantizedPalette.Add(c); } } using (var stream = new FileStream(targetFileName, FileMode.Create)) { var encoder = new PngEncoder { Quantizer = new PaletteQuantizer(quantizedPalette.ToArray()), ColorType = PngColorType.Palette }; image.SaveAsPng(stream, encoder); stream.Close(); } return(targetFileName); } }
/// <summary> /// Initializes a new instance of the <see cref="WebSafePaletteQuantizer" /> class. /// </summary> /// <param name="options">The quantizer options defining quantization rules.</param> public WebSafePaletteQuantizer(QuantizerOptions options) : base(Color.WebSafePalette, options) { }