我需要将从文件加载的 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));
     }
 }

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

  • 我可以使用 8 位索引格式并提取字节吗?- Format8bppIndexed
  • 我可以通过将 32 位颜色 R、G、B 值减少到 8 位来计算像素颜色吗?
  • 是否有一个 C# 库可以做到这一点?
  • “最简单的方法是创建一个新的8个位图,然后将24位图像绘制到其中。” - 如何?
有帮助吗?

解决方案

虽然我不确定如何使用普通的 C# 来做到这一点,但你可以使用 免费图像项目 转换图像格式的库:

FreeImage是一个开源库项目,适用于希望支持PNG,BMP,JPEG,TIFF等流行图形图像格式的开发人员,如今的多媒体应用程序需要。免费图像易于使用,快速,多线程安全,与所有32位版本的Windows和Cross-Platform兼容(均与Linux和Mac OS X一起使用)。

它是用 C++ 编写的,但具有可供您使用的良好 .NET 包装器。

其他提示

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

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

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

#2 只取绿色分量。最好观看。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top