2015-10-08 82 views
2

我正在使用WinForms。我的表格中有一個圖片框。當我在圖片框中打開圖片時,只需點擊一個按鈕即可反轉顏色,但我的代碼非常慢。我該如何提高性能。在C中快速反轉圖像#

private void Button1_Click(object sender, System.EventArgs e) 
    { 
     Bitmap pic = new Bitmap(PictureBox1.Image); 
     for (int y = 0; (y 
        <= (pic.Height - 1)); y++) { 
      for (int x = 0; (x 
         <= (pic.Width - 1)); x++) { 
       Color inv = pic.GetPixel(x, y); 
       inv = Color.FromArgb(255, (255 - inv.R), (255 - inv.G), (255 - inv.B)); 
       pic.SetPixel(x, y, inv); 
       PictureBox1.Image = pic; 
      } 

     } 

    } 

回答

7

您每次更改像素時都會設置控件的圖片,這會導致控件重新繪製自己。等到你已經完成了圖像:

Bitmap pic = new Bitmap(PictureBox1.Image); 
for (int y = 0; (y <= (pic.Height - 1)); y++) { 
    for (int x = 0; (x <= (pic.Width - 1)); x++) { 
     Color inv = pic.GetPixel(x, y); 
     inv = Color.FromArgb(255, (255 - inv.R), (255 - inv.G), (255 - inv.B)); 
     pic.SetPixel(x, y, inv); 
    } 
} 
PictureBox1.Image = pic; 
+0

@D士丹利感謝您的解釋,並給予一個例子。它像一個魅力。 – taji01

+3

'Get' /'SetPixel'非常慢。谷歌的'LockBits'並使用它 - 你可以得到更快的結果數量級。 –

+0

@LucasTrzesniewski我會研究一下。在這種情況下,我不太熟悉如何使用LockBits。如果你能舉一個例子,我會很感激。 – taji01

-2

它`爲我工作...

 private Image InvertingImage(Image source) 
    { 
     //create a blank bitmap the same size as original 
     Bitmap newBitmap = new Bitmap(source.Width, source.Height); 

     //get a graphics object from the new image 
     Graphics g = Graphics.FromImage(newBitmap); 

     // create the negative color matrix 
     ColorMatrix colorMatrix = new ColorMatrix(new float[][] 
{ 
    new float[] {-1, 0, 0, 0, 0}, 
    new float[] {0, -1, 0, 0, 0}, 
    new float[] {0, 0, -1, 0, 0}, 
    new float[] {0, 0, 0, 1, 0}, 
    new float[] {1, 1, 1, 0, 1} 
}); 

     // create some image attributes 
     ImageAttributes attributes = new ImageAttributes(); 

     attributes.SetColorMatrix(colorMatrix); 

     g.DrawImage(source, new Rectangle(0, 0, source.Width, source.Height), 
        0, 0, source.Width, source.Height, GraphicsUnit.Pixel, attributes); 

     //dispose the Graphics object 
     g.Dispose(); 

     return newBitmap; 
    } 
+0

此代碼似乎與[本答案](http://stackoverflow.com/a/11781561/1364007)(包括註釋)中的代碼**相同**,本身已被複制(帶有歸屬) [這裏](http://mariusbancila.ro/blog/2009/11/13/using-colormatrix-for-creating-negative-image/)。如果您從其他地方複製它,則應該將原始屬性歸類以避免[抄襲](http://meta.stackoverflow.com/q/251389/1364007)。 –