将.bmp文件解码为二进制文件

时间:2011-12-01 17:55:30

标签: c# bitmap barcode getpixel

我正在尝试编写一个旨在将.bmp文件转换为二进制文件的C#程序。 该文件是16x16像素。每个黑色像素代表二进制的一个,因此数字10将是█[]█[] [] [] [] []

我遇到的问题是我的代码无法识别黑色像素,因此输出始终为零。

    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,他们可以帮助我。此外,任何改进代码的方法都会受到欢迎。

3 个答案:

答案 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)颜色的变量,然后在 if 语句中使用它。 所以做一些像:

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

在您方法的开头,然后将 ,如果 更改为:

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

<强>更新 循环起始值似乎存在一些小问题。我已经更新了你的代码。

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 数组来包含 bool 值,您可以将其更改为int并指定1或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;
        }
    }
}

答案 2 :(得分: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;
    }
    ...

当你打破'col'时,看看它是什么。是255,255,255吗?有什么关闭?

这至少可以让你看到“黑色”像素与“白色”像素是什么,你可以正确地开启它。

编辑:Hans正确地指出你需要在这些循环上从'0'而不是'1'开始。