Расшифровка .bmp файла в двоичный файл - PullRequest
1 голос
/ 01 декабря 2011

Я пытаюсь написать программу на C #, предназначенную для преобразования файла .bmp в двоичный файл. Файл 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 ]

3 голосов
/ 01 декабря 2011

Источником проблемы, вероятно, является то, что 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)

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 , содержащий значения bool , вы можете изменить его на int и назначить 1 или 0. Таким образом, вы не можете не нужно конвертировать позже:).

1 голос
/ 01 декабря 2011

Вы можете использовать эту утилиту для преобразования вашего растрового изображения в двоичный текст.Просто проверьте, равен ли каждый пиксельный канал 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;
        }
    }
}
0 голосов
/ 01 декабря 2011

Сделайте эти изменения:

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» в этих циклах.

...