/// <summary> /// Takes a Surface and quantizes it down to an 8-bit bitmap. /// </summary> /// <param name="quantizeMe">The Surface to quantize.</param> /// <param name="ditherAmount">How strong should dithering be applied. 0 for no dithering, 8 for full dithering.</param> /// <param name="maxColors">The maximum number of colors to use. This may range from 2 to 255.</param> /// <param name="progressCallback">The progress callback delegate.</param> /// <returns>An 8-bit Bitmap that is the same size as quantizeMe.</returns> protected Bitmap Quantize(Surface quantizeMe, int ditherAmount, int maxColors, ProgressEventHandler progressCallback) { if (ditherAmount < 0 || ditherAmount > 8) { throw new ArgumentOutOfRangeException( "ditherAmount", ditherAmount, "Out of bounds. Must be in the range [0, 8]"); } if (maxColors < 2 || maxColors > 255) { throw new ArgumentOutOfRangeException( "maxColors", maxColors, "Out of bounds. Must be in the range [2, 255]"); } using (Bitmap bitmap = quantizeMe.CreateAliasedBitmap(quantizeMe.Bounds, true)) { OctreeQuantizer quantizer = new OctreeQuantizer(maxColors, 8); quantizer.DitherLevel = ditherAmount; Bitmap quantized = quantizer.Quantize(bitmap, progressCallback); return quantized; } }
/// <summary> /// Takes a Surface and quantizes it down to an 8-bit bitmap. /// </summary> /// <param name="quantizeMe">The Surface to quantize.</param> /// <param name="ditherAmount">How strong should dithering be applied. 0 for no dithering, 8 for full dithering. 7 is generally a good default to use.</param> /// <param name="maxColors">The maximum number of colors to use. This may range from 2 to 256.</param> /// <param name="enableTransparency">If true, then one color slot will be reserved for transparency. Any color with an alpha value less than 255 will be transparent in the output.</param> /// <param name="progressCallback">The progress callback delegate.</param> /// <returns>An 8-bit Bitmap that is the same size as quantizeMe.</returns> protected Bitmap Quantize(Surface quantizeMe, int ditherAmount, int maxColors, bool enableTransparency, ProgressEventHandler progressCallback) { if (ditherAmount < 0 || ditherAmount > 8) { throw new ArgumentOutOfRangeException( "ditherAmount", ditherAmount, "Out of bounds. Must be in the range [0, 8]"); } if (maxColors < 2 || maxColors > 256) { throw new ArgumentOutOfRangeException( "maxColors", maxColors, "Out of bounds. Must be in the range [2, 256]"); } // TODO: detect if transparency is needed? or take another argument using (Bitmap bitmap = quantizeMe.CreateAliasedBitmap(quantizeMe.Bounds, true)) { OctreeQuantizer quantizer = new OctreeQuantizer(maxColors, enableTransparency); quantizer.DitherLevel = ditherAmount; Bitmap quantized = quantizer.Quantize(bitmap, progressCallback); return quantized; } }