2013-03-13 104 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

相關問題