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

廉价感情. 提交于 2019-12-20 04:22:18

问题


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?

回答1:


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.




回答2:


I already did it in one Pattern Recognition project. Searching some image processing and pattern recognition books you can find these solutions.

a) If you want to convert to greyscale you can find in general two solutions.

#1 Averaging RGB channels. - You can take 8-bit values for avery single channel and calculate pixel = ( R+G+B )/3

#2 Take only the Green component. It is best viewed.

b) If you want to convert to 8bit color representation you need to use a Color table. You can see a solution here http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx



来源:https://stackoverflow.com/questions/1761042/c-sharp-how-to-convert-an-image-into-an-8-bit-color-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!