2011-12-01 237 views
1

我正在嘗試編寫一個旨在將.bmp文件轉換爲二進制文件的C#程序。 該文件是16x16像素。每個黑色像素代表一個二進制的數字,因此數字10會是█[]█[] [] [] [] [] []將.bmp文件解碼爲二進制

我遇到的問題是我的代碼不能識別黑色像素,所以輸出始終爲零。

public Bitmap imgToDecode; 

    private void button2_Click(object sender, EventArgs e) 
    { 
     int i = (imgToDecode.Height * imgToDecode.Width); 
     bool[] pixData = new bool[i]; 

     int p = 0; 

     for (int k = 1; k < imgToDecode.Height; k++) 
     { 
      for (int m = 1; m < imgToDecode.Width; m++) 
      { 
       if (imgToDecode.GetPixel(m, k) == Color.Black) 
       { 
        pixData[p] = true; 
       } 
       else 
       { 
        pixData[p] = false; 
       } 
       p++; 
      } 
     } 

     for (int n = 0; n < pixData.Length; n++) 
     { 
      textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n]))); 
     } 


    } 

如果有人有一個想法,爲什麼輸出爲0,他們可以請幫助我。也歡迎任何改進代碼的方法。

+0

你檢查什麼.GetPixel()將返回?也許你的源圖像中的黑色實際上是非黑色的,所以像素可能是255,255,254,而color.black是255,255,255。 –

+0

爲什麼在地球上你想要一個'bool'數組中的數據? (只是好奇) – Cameron

+3

至少有一個錯誤是你開始循環在1而不是0. –

回答

3

問題的來源是可能是Color.Black等於Color.FromArgb(0,0,0)

的解決方案可能會改變行:

if (imgToDecode.GetPixel(m, k) == Color.Black) 

到:

if (imgToDecode.GetPixel(m, k) == Color.FromArgb(0, 0, 0)) 

或者甚至更好,聲明包含可變的(0,0,0)顏色,然後使用它在這如果聲明。 所以這樣做:

Color black = Color.FromArgb(0, 0, 0); 

在你的方法開始,然後改變如果到:

if (imgToDecode.GetPixel(m, k) == black) 

UPDATE: 似乎有與循環的一些小問題開始值。我更新了你的代碼。

public Bitmap imgToDecode; 

private void button2_Click(object sender, EventArgs e) 
{ 
    textBox2.Text = ""; 

    Color black = Color.FromArgb(0, 0, 0); 

    int i = (imgToDecode.Height * imgToDecode.Width); 
    bool[] pixData = new bool[i]; 

    int p = 0; 

    for (int k = 0; k < imgToDecode.Height; k++) 
    { 
     for (int m = 0; m < imgToDecode.Width; m++) 
     { 
      pixData[p] = (imgToDecode.GetPixel(m, k) == black); 

      p++; 
     } 
    } 

    for (int n = 0; n < pixData.Length; n++) 
    { 
     textBox2.Text = (textBox2.Text + (Convert.ToInt32(pixData[n]))); 
    } 
} 

如果您不需要pixData陣列包含布爾值,則可以將其更改爲int和ASIGN 1或0。這樣,您就不必把它轉換後: )。

+0

謝謝,這工作完美。 :d – Krikler7

0

進行這些更改:

for (int m = 1; m < imgToDecode.Width; m++) 
{ 
    Color col = imgToDecode.GetPixel(m, k); 
    if (col == Color.Black) //<---- Put a breakpoint here and see what col is. 
    { 
     pixData[p] = true; 
    } 
    ... 

當您在 '山坳' 打破,看看它是什麼。是255,255,255嗎?什麼東西接近?

這至少讓你看到'黑'像素與'白'像素是什麼,你可以正確地打開它。

編輯:漢斯指出正確,你需要在'0'而不是'1'在這些循環上開始。

1

您可以使用此實用程序將您的位圖轉換爲二進制文本。只是檢查,如果每個像素渠道等於0,然後返回1(如黑色)或0(如白色):

public static IEnumerable<int> ToBinary(this Bitmap imgToDecode) 
{ 
    for (int k = 0; k < imgToDecode.Height; k++) 
    { 
     for (int m = 0; m < imgToDecode.Width; m++) 
     { 
      yield return (imgToDecode.GetPixel(m, k).R == 0 && 
          imgToDecode.GetPixel(m, k).G == 0 && 
          imgToDecode.GetPixel(m, k).B == 0) ? 1 : 0; 
     } 
    } 
} 
相關問題