2012-12-31 92 views
2

我使用這個代碼:位圖區域已被鎖定異常

internal static Image ColorReplacer(Image Img, Color oldcolor, Color newcolor, int tolerence) 
     { 
      // Gotten From -> Code Project 
      Bitmap bmap = (Bitmap)Img.Clone(); 
      Color c; 
      int iR_Min, iR_Max; int iG_Min, iG_Max; int iB_Min, iB_Max; 
      //Defining Tolerance 
      //R 
      iR_Min = Math.Max((int)oldcolor.R - tolerence, 0); 
      iR_Max = Math.Min((int)oldcolor.R + tolerence, 255); 
      //G 
      iG_Min = Math.Max((int)oldcolor.G - tolerence, 0); 
      iG_Max = Math.Min((int)oldcolor.G + tolerence, 255); 
      //B 
      iB_Min = Math.Max((int)oldcolor.B - tolerence, 0); 
      iB_Max = Math.Min((int)oldcolor.B + tolerence, 255); 

      for (int x = 0; x < bmap.Width; x++) 
      { 
       for (int y = 0; y < bmap.Height; y++) 
       { 
        c = bmap.GetPixel(x, y); 
        //Determinig Color Match 
        if ((c.R >= iR_Min && c.R <= iR_Max) && 
         (c.G >= iG_Min && c.G <= iG_Max) && 
         (c.B >= iB_Min && c.B <= iB_Max) 
         ) 
         if (newcolor == Color.Transparent) 
          bmap.SetPixel(x, y, Color.FromArgb(0, newcolor.R, newcolor.G, newcolor.B)); 
         else 
          bmap.SetPixel(x, y, Color.FromArgb(c.A, newcolor.R, newcolor.G, newcolor.B)); 
       } 
      } 
      return (Image)bmap.Clone(); 
     } 

此代碼的工作非常出色。它將我的白色圖標圖像成功更改爲另一種顏色。 問題是:一旦我改變它,我不能再改變它。它給了我「位圖區域已經被鎖定的異常」。我假設這是因爲GetPixel()鎖定了圖像?

有人可以提出一個很好的解決這個問題嗎? PS:據我所知,GetPixel()是一個非常慢的方法,但是,我使用8圖像,它們都是24像素。它們非常小,所以我不認爲GetPixel()的性能是一個很大的問題。

回答

0

我剛剛測試了您的代碼,並且它正確執行了(即,我可以每次在不同顏色的單個圖像上多次調用ColorReplacer,然後將其繪製到表單中)。

你能提供一個你正在使用的代碼樣本來調用你的ColorReplacer方法嗎?

+0

肯定。 Button1.Image = ColorReplacer(Button1.Image,Color.White,Clr,50); Button1圖像是從設計文件「導入」(它不在資源中)。 –

+0

當你嘗試再次調用它時,ColorReplacer中的哪一行會引發異常?它是GetPixel/SetPixel還是克隆? – djhayman

+0

GetPixel()引發異常。 –