2013-10-25 92 views
2

我製作了一個程序,可以從圖片中獲取所有圖像像素RGB顏色代碼。基本上,它將y位置設置爲常量,並通過循環將x位置從零變爲寬度以及y。有效獲取圖像的所有像素信息

好吧,它的工作,但問題是需要超過20分鐘才能從所有像素(1000 * 604高度寬)圖像。請任何人幫忙?

如果這個過程需要這麼長時間,我感到很驚訝,那麼我們如何從圖像製作一個像條碼閱讀器這樣的程序。我想從圖像中獲取所有像素值,下面是我的C#代碼。

我也上傳了我的程序here,如果您不同意,請檢查一下。

void myimage() { 

     mypic = new Bitmap(pathname); 
     int imwid = mypic.Width; 
     int imhei = mypic.Height; 
     int total=imwid*imhei; 

     for (int z = 0; z <imhei;z++) 
     { 
      for (int i = 0; i < imwid; i++) 
      { 
       Color pixelColor = mypic.GetPixel(i, z); 

       textBox2.AppendText(" " + pixelColor.R + 
        "  " + pixelColor.G + 
        "  " + pixelColor.B + "  " + 
        pixelColor.A + 
        Environment.NewLine); 
      } 
     } 
    } 
+2

可能重複[C#圖像處理與lockbits,替代getpixel?](http://stackoverflow.com/questions/12168654/c-sharp-image-processing-with-lockbits-alternative-to-getpixel) – CodeCaster

+3

此外,調用'TextBox.AppendText'幾萬次是緩慢的。使用'StringBuilder'。 – CodeCaster

+1

此外,_「我們如何從圖像製作條形碼閱讀器這樣的程序」_,請勿重新發明輪子:請參閱[推薦開源.NET條形碼閱讀器庫](http://stackoverflow.com/questions/ 191192 /推薦 - 一個開源的淨條碼閱讀器庫)。 – CodeCaster

回答

2

看看這個:

var data = mypic.LockBits(
    new Rectangle(Point.Empty, mypic.Size), 
    ImageLockMode.ReadWrite, mypic.PixelFormat); 
var pixelSize = data.PixelFormat == PixelFormat.Format32bppArgb ? 4 : 3; // only works with 32 or 24 pixel-size bitmap! 
var padding = data.Stride - (data.Width * pixelSize); 
var bytes = new byte[data.Height * data.Stride]; 

// copy the bytes from bitmap to array 
Marshal.Copy(data.Scan0, bytes, 0, bytes.Length); 

var index = 0; 
var builder = new StringBuilder(); 

for (var y = 0; y < data.Height; y++) 
{ 
    for (var x = 0; x < data.Width; x++) 
    { 
     Color pixelColor = Color.FromArgb(
      pixelSize == 3 ? 255 : bytes[index + 3], // A component if present 
      bytes[index + 2], // R component 
      bytes[index + 1], // G component 
      bytes[index]  // B component 
      ); 

     builder 
      .Append(" ") 
      .Append(pixelColor.R) 
      .Append("  ") 
      .Append(pixelColor.G) 
      .Append("  ") 
      .Append(pixelColor.B) 
      .Append("  ") 
      .Append(pixelColor.A) 
      .AppendLine(); 

     index += pixelSize; 
    } 

    index += padding; 
} 

// copy back the bytes from array to the bitmap 
Marshal.Copy(bytes, 0, data.Scan0, bytes.Length); 

textBox2.Text = builder.ToString(); 

僅僅是一個例子,讀一些好的教程關於一般LockBits和成像要了解清楚發生了什麼。

+1

Alessandro D'Andria我很高興爲response.i將學習更多關於LOCKBITS。 –

+1

我知道我試圖做的方式是完全錯誤的。我發現artical http://www.mfranc.com/programming/operacje-na-bitmapkach-net-1/ 謝謝 –

+0

請不要忘記解鎖你的鎖定位。另外,字節數組是未修改的;根本沒有理由將其複製回圖像中。 – Nyerguds

1

獲取像素信息不應該花那麼長時間。你能記下運行時間爲myimage()嗎?緩慢可能是其他地方。也請嘗試刪除以textBox2.AppendText開頭的行myimage(),然後查看它運行得有多快。

+2

'GetPixel'確實需要很長的執行時間。使用'LockBits'是實現這一點的方法。 – joe

+0

我同意''LockBits''更快,但以我的經驗來看,''GetPixel''不需要像這樣的小圖像20分鐘。他在做什麼?原來的4.77MHz IBM PC? – acfrancis

+1

等待...確切沒有我的電腦是(英特爾核心2做的,4GB RAM)電腦,我嘗試在我的核心i5華碩筆記本電腦,但問題是一樣的..真正令人高興的事情是exute至少20分鐘,也得到沒有反應..和我試圖不同的圖像有些大。我使用圖像704寬度1400高度它得到沒有響應在膝上和電腦 檢查,如果你不同意.i上升它http://www.mediafire。 com /?7etr90i4hqkoa2q –