You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中替换图像黑色背景为红色失效,优化后仍有残留如何解决?

问题:将图像黑色背景替换为红色的代码未生效

我尝试将图像中的黑色像素替换为红色,原图像如下:
原图像

以下是我的代码:

public static Bitmap ChangeColor(Bitmap scrBitmap)
{            
    Color newColor = Color.Red;
    Color actualColor;            
    Bitmap newBitmap = new Bitmap(scrBitmap.Width, scrBitmap.Height);

    for (int i = 0; i < scrBitmap.Width; i++)
    {
        for (int j = 0; j < scrBitmap.Height; j++)
        {
            actualColor = scrBitmap.GetPixel(i, j);

            if (actualColor.R == 0 && actualColor.G == 0 && actualColor.B == 0)
                newBitmap.SetPixel(i, j, Color.FromArgb(actualColor.A, Color.Red));
        }
    }

    return newBitmap;
}

加载代码:

Bitmap image = new Bitmap(@"D:\test.jpg");
pictureBox1.Image = ChangeColor(image);

我仅想将黑色背景改为红色,但代码未生效,请问遗漏了什么?


编辑1

我尝试了其他帖子的解决方案,但它改变了整个图像的颜色。

编辑2

我试用了@JonasH的方案,代码如下:

if (0.3 * actualColor.R + 0.59 * actualColor.G + 0.11 * actualColor.B < 10)
    newBitmap.SetPixel(i, j, Color.FromArgb(actualColor.A, Color.Red));
else
    newBitmap.SetPixel(i, j, actualColor);

该方案虽生效但效果不佳,仍有一些接近黑色的像素未被替换,结果图如下:
处理后结果


问题原因与解决方案

1. 原代码未生效的核心原因

  • 原代码仅判定**完全纯黑(R=0、G=0、B=0)**的像素,但实际图像的黑色背景因压缩、噪点等问题,大多是接近黑色的深灰色(RGB值略大于0),不会触发替换逻辑。
  • 原代码未处理非黑色像素,新Bitmap中这些像素默认是透明/黑色,导致最终显示异常。

2. 优化后的可行代码

放宽黑色判定阈值,同时保留非黑色像素的原有颜色:

public static Bitmap ChangeColor(Bitmap scrBitmap)
{            
    Color newColor = Color.Red;
    Color actualColor;            
    Bitmap newBitmap = new Bitmap(scrBitmap.Width, scrBitmap.Height);

    // 黑色阈值,可根据图像实际情况调整(建议范围20-50)
    int blackThreshold = 30;

    for (int i = 0; i < scrBitmap.Width; i++)
    {
        for (int j = 0; j < scrBitmap.Height; j++)
        {
            actualColor = scrBitmap.GetPixel(i, j);

            // 判断是否为接近黑色的像素:RGB通道值均低于阈值
            bool isDarkPixel = actualColor.R < blackThreshold && 
                               actualColor.G < blackThreshold && 
                               actualColor.B < blackThreshold;

            if (isDarkPixel)
            {
                newBitmap.SetPixel(i, j, Color.FromArgb(actualColor.A, newColor));
            }
            else
            {
                // 保留原像素的颜色,避免图像内容丢失
                newBitmap.SetPixel(i, j, actualColor);
            }
        }
    }

    return newBitmap;
}

3. 进阶优化建议

  • GetPixel和SetPixel方法性能较低,处理大图像时建议使用LockBits直接操作图像内存,大幅提升处理速度。
  • 若仍有残留的深灰色像素,可适当提高blackThreshold的值(如调整到40-50),直到背景完全替换。

内容的提问来源于stack exchange,提问作者Shaiwal Tripathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 17:54:32