2009-11-19 214 views
1

我需要将从文件加载的PNG图像转换为其他设备(嵌入式编程)使用的每像素8位字节数组。C# - 如何将图像转换为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)); 
    } 
} 

那么,如何可以将图像转换成每个像素的字节数组的8位?

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

你说你的设备不能做索引。那么它如何使用每像素8位?它是灰度吗? – Chris 2009-11-19 05:51:00

+2

还是它有2位的红色,3位的绿色,3位的蓝色,或类似的东西? – Chris 2009-11-19 05:52:12

+0

从我看到的最难的部分将生成实际的调色板。 – Nyerguds 2017-03-31 07:32:26

回答

1

虽然我不知道如何与普通的香草C#做到这一点,你可以使用FreeImage Project库转换图像格式:

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

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

0

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

a)如果你想转换为灰度,你一般可以找到两种解决方案。

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

#2只取绿色成分。这是最好的看法。

b)如果你想转换为8位颜色表示,你需要使用颜色表。 你可以在这里看到一个解决方案http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx

相关问题