1

我正在尝试编写一个旨在将 .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,请他们帮助我。也欢迎任何改进代码的方法。

4

3 回答 3

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更改为:

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。这样您以后不必转换它:)。

于 2011-12-01T18:09:40.593 回答
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;
        }
    }
}
于 2011-12-01T18:10:45.720 回答
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 吗?有什么接近的吗?

这至少可以让您看到“黑色”像素与“白色”像素是什么,并且您可以正确打开它。

编辑:汉斯正确地指出,在这些循环中,您需要从“0”而不是“1”开始。

于 2011-12-01T18:03:04.427 回答