2013-03-13 87 views
4

在我的灰度图中,我需要找到具体的值并用某种颜色(例如黄色)替换它。这是我现在的代码,但速度并不像我所需要的那么快。有没有更有效的方法来实现这一目标?我对ColorMatrix类有红色,但找不到替换单个值而不影响整个图像的方式。替换位图/图像中特定颜色的有效方法

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); 
} 
+0

你可以试试BitBlt。 [Here's](http://www.vbaccelerator.com/home/VB/Tips/Replace_One_Colour_With_Another_in_a_Picture/article.asp)一个VB示例。 – mbeckish 2013-03-13 13:24:47

+1

非常小的调整可能会移动你的'data.Scan0','data.Width','data.Stride'和'BytePerPixel == 4'检查循环的外部,因为它们在整个循环期间是有效的常量循环(最后一个意味着你将不得不复制基本的循环结构)。它可能会提供一个小的(但振振频率的_可测量的改进,取决于这称为的频率和位图的大小) – 2013-03-13 13:31:46

+0

添加图像的结果和实际结果 – KF2 2013-04-03 17:12:36

回答

1

在4信道的图像,其中每个像素是4个字节的情况下(每通道8位)时,可以使用一个256项查找表索引由row[0]和同时分配所有四个通道作为单个32位int

+0

好点,但4通道图像是一种非常罕见的情况,我已经为了兼容性添加此检查。所以我现在缺少Int24类型:D – VladL 2013-05-24 13:37:19

+0

在3通道图像的情况下,您可能会尝试同时处理4个像素,并且某些位掩码将它们视为3个“int”。 – 2013-05-26 06:54:46

+0

你能举个例子吗? – VladL 2013-05-26 07:25:00

相关问题