C# - 如何将图像转换为8位彩色图像?

时间:2009-11-19 05:19:07

标签: c# image bitmap color-depth

我需要将从文件加载的PNG图像转换为另一个设备使用的每像素8位字节数组(嵌入式编程)。

我正在逐个像素地复制到使用16位颜色创建的新图像 - Format16bppRgb565,但我需要Format8bpp,这在.NET Framework中不存在。 (我无法使用Format8bppIndexed,因为其他设备无法处理索引位图)

 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));
     }
 }

那么如何将Image转换为每像素8位字节数组呢?

  • 我可以使用8位索引格式并提取字节吗? - Format8bppIndexed
  • 我可以通过将32位颜色的R,G,B值减少到8位来计算像素颜色吗?
  • 是否有C#库已经执行此操作?
  • “最简单的方法是创建一个新的8位位图,然后将24位图像绘制到其上。” - 怎么样?

2 个答案:

答案 0 :(得分:1)

虽然我不确定如何使用普通的C#,你可以使用FreeImage Project库来转换图像格式:

  

FreeImage是一个开源库   希望开发人员的项目   支持流行的图形图像   格式如PNG,BMP,JPEG,TIFF和   今天的多媒体所需的其他人   应用。 FreeImage很容易   使用,快速,多线程安全,   与所有32位版本兼容   Windows和跨平台(工作   Linux和Mac OS X都有。)

它是用C ++编写的,但是你可以使用很好的.NET包装器。

答案 1 :(得分:0)

我已经在一个模式识别项目中完成了它。搜索一些图像处理和模式识别书籍,您可以找到这些解决方案。

a)如果您想转换为灰度,您通常可以找到两种解决方案。

#1 平均RGB通道。 - 您可以为每个通道获取8位值并计算像素=(R + G + B)/ 3

#2 仅使用绿色组件。最好看。

b)如果要转换为8位颜色表示,则需要使用颜色表。     您可以在此处查看解决方案http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx