2011-12-01 235 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; 
     } 
    } 
}