C# - 如何将图像转换为 8 位彩色图像?
-
21-09-2019 - |
题
我需要将从文件加载的 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
不隶属于 StackOverflow