Png NeuQuant Example

PNG Indexed format Format Conversion

Saves image to PNG format using different bitness, color quantization and dithering algorithms.

Сode Snippet

public static void Run()
{
    Save("Chicago.jpg");
    Save("Stamp.png");
}

private static void Save(string sourceFileName)
{
    // Source file information
    long sourceFileSize = new System.IO.FileInfo(sourceFileName).Length;

    Console.WriteLine("Source file:");
    Console.WriteLine("  {0}", sourceFileName);
    Console.WriteLine("  {0:f2} KB", sourceFileSize / 1024f);

    var baseName = System.IO.Path.GetFileNameWithoutExtension(sourceFileName);

    // Convert to 24-bit PNG
    {
        var png24bitFileName = baseName + "_24bit.png";

        // Save to PNG
        using (var bitmap = new Bitmap(sourceFileName))
        {
            bitmap.Save(png24bitFileName, new PngSettings(true));
        }

        long png24bitFileSize = new System.IO.FileInfo(png24bitFileName).Length;

        Console.WriteLine("PNG 24-bit:");
        Console.WriteLine("  {0}", png24bitFileName);
        Console.WriteLine("  {0:f2} KB ({1:f2}%)", (float)png24bitFileSize / 1024f, (float)png24bitFileSize / (float)sourceFileSize * 100f);
    }

    // Convert to 8-bit PNG using the Octree color quantization and Floyd–Steinberg dithering algorithms
    {
        var png8bitFileName = baseName + "_8bit.png";

        // Save to PNG
        using (var bitmap = new Bitmap(sourceFileName))
        {
            bitmap.ColorManagement.Convert(PixelFormat.Format8bppIndexed);

            bitmap.Save(png8bitFileName, new PngSettings(true));
        }

        long png8bitFileSize = new System.IO.FileInfo(png8bitFileName).Length;

        Console.WriteLine("PNG 8-bit (Octree, Floyd–Steinberg, no alpha transparency):");
        Console.WriteLine("  {0}", png8bitFileName);
        Console.WriteLine("  {0:f2} KB ({1:f2}%)", (float)png8bitFileSize / 1024f, (float)png8bitFileSize / (float)sourceFileSize * 100f);
    }

    // Convert to 8-bit PNG using the Neuquant color quantization algorithm
    {
        var png8bitNeuQuantFileName = baseName + "_8bit_NeuQuant.png";

        // Save to PNG
        using (var bitmap = new Bitmap(sourceFileName))
        {
            bitmap.ColorManagement.Palette = new ColorPalette(ColorPaletteType.NeuQuant);
            bitmap.ColorManagement.Convert(PixelFormat.Format8bppIndexed);

            bitmap.Save(png8bitNeuQuantFileName, new PngSettings(true));
        }

        long png8bitNeuQuantFileSize = new System.IO.FileInfo(png8bitNeuQuantFileName).Length;

        Console.WriteLine("PNG 8-bit (NeuQaunt, with alpha transparency):");
        Console.WriteLine("  {0}", png8bitNeuQuantFileName);
        Console.WriteLine("  {0:f2} KB ({1:f2}%)", (float)png8bitNeuQuantFileSize / 1024f, (float)png8bitNeuQuantFileSize / (float)sourceFileSize * 100f);
    }
}

Input

Chicago.jpg

Stamp.png

Output

PngNeuQuant.txt

Source file:
  Chicago.jpg
  101.28 KB
PNG 24-bit:
  Chicago_24bit.png
  535.18 KB (528.40%)
PNG 8-bit (Octree, Floyd–Steinberg, no alpha transparency):
  Chicago_8bit.png
  191.58 KB (189.16%)
PNG 8-bit (NeuQaunt, with alpha transparency):
  Chicago_8bit_NeuQuant.png
  204.09 KB (201.50%)
Source file:
  Stamp.png
  225.84 KB
PNG 24-bit:
  Stamp_24bit.png
  306.25 KB (135.60%)
PNG 8-bit (Octree, Floyd–Steinberg, no alpha transparency):
  Stamp_8bit.png
  72.90 KB (32.28%)
PNG 8-bit (NeuQaunt, with alpha transparency):
  Stamp_8bit_NeuQuant.png
  90.76 KB (40.19%)

Chicago_24bit.png

Chicago_8bit.png

Chicago_8bit_NeuQuant.png

Stamp_24bit.png

Stamp_8bit.png

Stamp_8bit_NeuQuant.png

For AI-assisted development: Download Graphics Mill Code Samples XML Catalog