C# - How to convert an Image into an 8-bit color Image?

Robin Rodricks picture Robin Rodricks · Nov 19, 2009 · Viewed 13.2k times · Source

I need to convert a PNG Image loaded from a file into an 8 bit-per-pixel byte array used by another device (embedded programming).

I'm copying over pixel by pixel into a new Image created with a 16-bit color - Format16bppRgb565, but I need Format8bpp, which is not present in the .NET Framework. (I cannot use Format8bppIndexed since the other device cannot handle indexed bitmaps)

 Bitmap img = new Bitmap(imgPath);
 Bitmap img8 = new Bitmap(imgW, imgH, PixelFormat.Format16bppRgb565);
 for (int I = 0; I <= img.Width - 1; I++) {
     for (int J = 0; J <= img.Height - 1; J++) {
         img8.SetPixel(I, J, img.GetPixel(I, J));
     }
 }

So how can I convert an Image into an 8-bit per pixel byte array?

  • Can I use the 8-bit indexed format and extract the bytes? - Format8bppIndexed
  • Can I calculate the pixel colors by reducing the 32-bit color R,G,B values to 8-bit?
  • Is there a C# library that does this already?
  • "The easiest way is to create a new 8 bit bitmap, and draw your 24 bit image onto it." - how?

Answer

Dror Helper picture Dror Helper · Nov 19, 2009

Although I'm not sure how to do it with plain vanilla C# you can use the FreeImage Project libraries to convert images formats:

FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by today's multimedia applications. FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit versions of Windows, and cross-platform (works both with Linux and Mac OS X).

It's written in C++ but has good .NET wrappers you can use.