如何在c#中将位图图像转换为黑白? [复制]

Posted

技术标签:

【中文标题】如何在c#中将位图图像转换为黑白? [复制]【英文标题】:How to convert a bitmap image to black and white in c#? [duplicate] 【发布时间】:2011-06-07 20:18:45 【问题描述】:

可能重复:convert image to Black-White or Sepia in c#

我正在编写一个 C# 应用程序,它打开一个图像,然后单击一个按钮,它只以黑白显示! 我肯定会在网上找到很多信息,但我的搜索并没有给我很多可以理解和有用的信息。

我不知道如何进行。有人有建议吗 ?知道网上的教程吗?

【问题讨论】:

可能重复***.com/questions/2265910/… 【参考方案1】:

我曾经发现一个将位图转换为灰度的函数

public void ToGrayScale(Bitmap Bmp)

    int rgb;
    Color c;

    for (int y = 0; y < Bmp.Height; y++)
    for (int x = 0; x < Bmp.Width; x++)
    
        c = Bmp.GetPixel(x, y);
        rgb = (int)Math.Round(.299 * c.R + .587 * c.G + .114 * c.B);
        Bmp.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
    

该函数接受位图作为参数,并将其更改为灰度版本。

我希望这会有所帮助。

【讨论】:

(c.R + c.G + c.B) / 3 - 使图片变灰,但结果位图不正确。您应该使用:(c.R * .3) + (c.G * .59) + (c.B * .11)。或者如 A_Nablsi 的回答:(.299 * c.R + .587 * c.G + .114 * c.B)。 有用的函数,但只是想指出返回Bmp是一种误导,因为无论如何修改了Bmp参数的内容。抓住了我,因为我认为该函数正在返回一个新的位图。 对于文字黑色/白色:rgb = (int)(Math.Round(((double)(c.R + c.G + c.B) / 3.0) / 255) * 255); 这行得通,但没有保持透明度 - 这个虽然做到了:***.com/questions/3053889/…【参考方案2】:

编辑在此处查看更完整的答案:convert image to Black-White or Sepia in c#。

有很多方法可以去饱和彩色图像。事实上,可能没有一种“正确”或“正确”的方法可以做到这一点,尽管有些方法比其他方法更正确。 我假设您的图像是 RGB(红-绿-蓝)格式(尽管 BGR 也很常见)。

最简单的方法,应该适用于大多数照片(但对合成图像不太适用),就是只使用 3 个 RGB 通道的绿色通道。人类对光谱中绿色部分的变化最为敏感,因此绿色通道覆盖了大部分可见范围,非常接近您想要的灰度图像。

生成灰度图像的更好方法是使用 3 个 RGB 通道的加权平均值。选择相等的权重 (0.33*R+0.33*G+0.33*B) 将给出一个非常好的灰度图像。其他权重会给出不同的结果,其中一些可能会被认为更美观,而另一些可能会考虑到感知参数。

您始终可以将图像转换为只有一个单个灰度通道(和 2 个“颜色”通道)的颜色空间,例如 HSV(V 是灰度)、YUV(Y 是灰度)或 Lab(L 为灰度)。差异应该不会很大。

“去饱和”一词来自 HSV 空间。如果将图像转换为 HSV,将 S 通道(饱和度)设置为全零,然后渲染图像,您将获得 3 通道去饱和“彩色”图像。

【讨论】:

感谢您的评论!我用了另一种方式,更简单,但你的应该在其他情况下也可以使用,所以我随身携带!

以上是关于如何在c#中将位图图像转换为黑白? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在android中将图标转换为位图? [复制]

如何在xamarin android中将位图图像转换为gif?

如何在 EmguCV 中将图像转换为矩阵,然后将矩阵转换为位图?

在 .NET 2.0 中将位图转换为一个多页 TIFF 图像

如何在 c# 中的 iTextSharp pdf 中将位图显示为 jpeg 格式

C#:将位图图像流转换为 avi 文件