2013-03-15 63 views
2

當我試着翻動,在C# 但不安全代碼和指針位圖的問題是我得到的原始位圖作爲結果,而不是翻轉位圖實踐,似乎函數什麼都不做所有,所以我想知道我的代碼有什麼問題!翻轉位圖功能

請記住,我要翻轉pictureBox1.Image並將其設置爲pictureBox2.Image

private bool Flip_H() 
    { 
     try 
     { 
      b = new Bitmap(pictureBox1.Image); 
      bmdata = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
      int offset = bmdata.Stride - b.Width * 3; 
      byte back_up; 
      int BGRwidth = b.Width * 3; 
      unsafe 
      { 
       byte* p = (byte*)bmdata.Scan0; 
       for (int y = 0; y < b.Height; y++) 
       { 
        for (int x = 0; x < BGRwidth/2; x += 3) 
        { 
         back_up = p[x]; 
         p[x] = p[BGRwidth - x - 3]; 
         p[BGRwidth - x - 1] = back_up; 
         back_up = p[x + 1]; 
         p[x + 1] = p[BGRwidth - x - 2]; 
         p[BGRwidth - x - 2] = back_up; 
         back_up = p[x + 2]; 
         p[x + 2] = p[BGRwidth - x - 1]; 
        } 
        p += offset; 
       } 
      } 
      b.UnlockBits(bmdata); 
      pictureBox2.Image = b; 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 

我已經與GetPixel()SetPixel()功能做到了這一點,但你知道他們是太慢了,所以我試圖用指針提高我的代碼!

問題是Offset參數!謝謝大家誰幫助

+0

介意告訴我們什麼是錯在先?請解釋你不期待發生的事情。錯誤和例外,如果你有任何問題。 – Oded 2013-03-15 12:33:33

+0

RotateFlip有什麼問題?這對你來說太慢了嗎?你是否在循環中重複運行這些代碼? – 2013-03-15 12:35:55

+0

不,目的不是翻轉,我想知道在C#中的指針和不安全的代碼更好,所以我試圖翻轉一個位圖!並且我將來需要用於圖像處理的指針:) – Mehran 2013-03-15 12:39:32

回答

4

你的問題是,你永遠不會在Y方向前進。您只能在第一條掃描線上更改像素,因此其餘部分不會更改。這是因爲你做p += offset但你定義offset爲:

int offset = bmdata.Stride - b.Width * 3; 

而應該限定偏移量:

int offset = bmdata.Stride; 

既然你要添加的步幅,以字節爲單位,以獲得下一個掃描線。


此外,您的交換代碼中存在一個錯誤。您有:

back_up = p[x + 0]; 
p[x + 0] = p[BGRwidth - x - 3]; 
p[BGRwidth - x - 1] = back_up; // Error! 

back_up = p[x + 1]; 
p[x + 1] = p[BGRwidth - x - 2]; 
p[BGRwidth - x - 2] = back_up; 

back_up = p[x + 2]; 
p[x + 2] = p[BGRwidth - x - 1]; 
    // Missing! 

你應該有:

back_up = p[x + 0]; 
p[x + 0] = p[BGRwidth - x - 3]; 
p[BGRwidth - x - 3] = back_up; 

back_up = p[x + 1]; 
p[x + 1] = p[BGRwidth - x - 2]; 
p[BGRwidth - x - 2] = back_up; 

back_up = p[x + 2]; 
p[x + 2] = p[BGRwidth - x - 1]; 
p[BGRwidth - x - 1] = back_up; 
+0

我一開始認爲,但我認爲這就是'p + = offset'的目的所在。也許他需要檢查'offset'不是零。 – 2013-03-15 12:58:43

+0

那麼「p + = offset」呢?它不是在改變y方向嗎? – Mehran 2013-03-15 13:00:36

+1

@Dotrix是的,你的'抵消'是錯誤的。通過減去圖像的寬度乘以每像素的字節數,可以有效地將'offset'減少到0或接近0. – Virtlink 2013-03-15 13:02:27