Почему этот код не создает шаблон шахматной доски? - PullRequest
0 голосов
/ 25 апреля 2018

Мне интересно, почему этот кусок кода НЕ генерирует шаблон шахматной доски?

pbImage.Image = new Bitmap(8, 8);
        Bitmap bmp = ((Bitmap)pbImage.Image);
        byte[] bArr = new byte[64];
        int currentX = 0;
        int currentY = 0;
        Color color = Color.Black;
        do
        {
            currentY = 0;
            do
            {
                bmp.SetPixel(currentX, currentY, color);
                if (color == Color.Black) color = Color.White; else color = Color.Black;
                currentY++;
            } while (currentY < bitmapHeight);
            currentX++;
        } while (currentX < bitmapWidth);

        pbImage.Refresh();

Редактировать: я понял, что мне нужно расширить битмапы ctor с
new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format8bppIndexed), и, похоже, SetPixel не поддерживает проиндексированные изображения и ожидает цвет.

Моя точка зренияя хочу создать необработанные (чистые байтовые массивы) изображения в градациях серого и показать их на графическом блоке, сохраняя при этом максимально простую работу без использования каких-либо внешних библиотек.

1 Ответ

0 голосов
/ 25 апреля 2018

Ваш расчет не удался, потому что, если вы переключаетесь на каждый пиксель, то даже строки, начинающиеся с цвета 0, заканчиваются на цвете 1, что означает, что следующая строка снова будет начинаться с цвета 0.

0101010101010101
0101010101010101
0101010101010101
0101010101010101
etc...

Но поскольку в координатах X и Y любое горизонтальное и вертикальное перемещение на 1 пиксель по шаблону изменит цвет, фактический расчет того, хотите ли вы заполненный или незаполненный пиксель, можно упростить до (x + y) % 2 == 0.

Функция генерации шахматной доски, которую я поместил ниже, принимает массив цветов в качестве цветовой палитры и позволяет вам указать, какие конкретные индексы из этой палитры использовать в качестве двух цветов для использования в шаблоне.Если вам просто нужно изображение с ничего, кроме двухцветной палитры, содержащей черный и белый, вы можете просто назвать его так:

Bitmap check = GenerateCheckerboardImage(8, 8, new Color[]{Color.Black, Color.White}, 0,1);

Функция генерации:

public static Bitmap GenerateCheckerboardImage(Int32 width, Int32 height, Color[] colors, Byte color1, Byte color2)
{
    Byte[] patternArray = new Byte[width * height];
    for (Int32 y = 0; y < height; y++)
    {
        for (Int32 x = 0; x < width; x++)
        {
            Int32 offset = x + y * height;
            patternArray[offset] = (((x + y) % 2 == 0) ? color1 : color2);
        }
    }
    return BuildImage(patternArray, width, height, width, PixelFormat.Format8bppIndexed, colors, Color.Black);
}

BuildImage Функция, которую я использовал, является функцией общего назначения, которую я сделал для преобразования байтового массива в изображение.Вы можете найти это в этом ответе .

Как объяснено в остальной части этого вопроса и ответах на него, аргумент stride - это количество байтов в каждой строке изображения.данные.Для построенного 8-битного массива, который мы здесь получили, он просто идентичен ширине, но при загрузке он обычно округляется до кратного 4 и может содержать неиспользуемые байты заполнения.(Функция позаботится обо всем этом, поэтому входной байтовый массив не имеет таких требований.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...