C# 替换位图/图像中特定颜色的有效方法

C# 替换位图/图像中特定颜色的有效方法,c#,.net,image,image-processing,bitmap,C#,.net,Image,Image Processing,Bitmap,在我的灰度图片中,我需要找到特定的值,并用一些颜色替换它,例如黄色。这是我现在拥有的代码,但它没有我需要的那么快。有没有更有效的方法来实现这一点?我已经对该类进行了详细介绍,但无法找到在不影响整个图像的情况下替换单个值的方法 unsafe { byte stlThres = 115; int bytePerPixel = Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat) / 8; var data =

在我的灰度图片中,我需要找到特定的值,并用一些颜色替换它,例如黄色。这是我现在拥有的代码,但它没有我需要的那么快。有没有更有效的方法来实现这一点?我已经对该类进行了详细介绍,但无法找到在不影响整个图像的情况下替换单个值的方法

unsafe
{
    byte stlThres = 115;

    int bytePerPixel = Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat) / 8;
    var data = kpImageViewer1.Image.LockBits(new Rectangle(0, 0, kpImageViewer1.Image.Width, kpImageViewer1.Image.Height), ImageLockMode.WriteOnly, kpImageViewer1.Image.PixelFormat);
    for (int y = 0; y < data.Height; y++)
    {
        byte* row = (byte*)data.Scan0 + (y * data.Stride);

        for (int x = 0; x < data.Width; x++, row += bytePerPixel)
        {
            if (row[0] == stlThres)
            {
                row[0] = 0; //b
                row[1] = 255; //g
                row[2] = 255; //r
                if (bytePerPixel == 4)
                {
                    row[3] = 255; //a
                }
            }
        }
    }
    kpImageViewer1.Image.UnlockBits(data);
}
不安全
{
字节stlThres=115;
int bytePerPixel=Image.GetPixelFormatSize(kpImageViewer1.Image.PixelFormat)/8;
var data=kpImageViewer1.Image.LockBits(新矩形(0,0,kpImageViewer1.Image.Width,kpImageViewer1.Image.Height),ImageLockMode.WriteOnly,kpImageViewer1.Image.PixelFormat);
对于(int y=0;y
对于4通道图像,其中每个像素为4字节(每个通道8位),您可以使用按
行[0]
索引的256项查找表,并将所有四个通道同时指定为单个32位
int

你可以试试BitBlt。一个VB示例。非常小的调整可能是将
数据.Scan0
数据.Width
数据.Stride
,以及
BytePerPixel==4
移动到循环之外,因为它们实际上是循环持续时间内的常量(最后一个参数意味着必须复制基本循环结构)。它可能会提供一个小的(但似乎可以测量的改进取决于调用的频率和位图的大小)添加结果和实际结果的图像良好点,但4通道图像是一个非常罕见的情况,我添加了这个检查只是为了兼容性。因此,我现在缺少Int24类型:在3通道图像的情况下,您可能会尝试同时处理4个像素,并使用一些位掩码将它们视为3
int
s。您能举个例子吗?我不确定这是否真的值得。只需移除环路外的4通道测试,并保持环路紧密。