为什么这段代码不能创建棋盘格局?

时间:2018-04-24 22:04:03

标签: c# winforms bitmap

我想知道为什么这段代码不能生成棋盘图案?

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();

编辑:我意识到我需要用VB扩展Bitmaps ctor new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format8bppIndexed) 似乎SetPixel不支持索引图像并且需要一个Color。

我的观点是我想创建原始(纯字节数组)灰度图像并将其显示在图片框上,同时保持尽可能简单,而不使用任何外部库。

1 个答案:

答案 0 :(得分:0)

您的计算失败,因为如果您切换每个像素,那么以颜色0开头的偶数行将以颜色1结束,这意味着下一行将再次以颜色0开始。

0101010101010101
0101010101010101
0101010101010101
0101010101010101
etc...

但是,因为在X和Y坐标中,横跨图案的任何水平和垂直移动1个像素都会改变颜色,实际计算是否需要填充或未填充的像素可以简化为{{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); } 函数是我用来将字节数组转换为图像的通用函数。你可以找到它in this answer

正如该问题的其余部分及其答案中所解释的,BuildImage参数是图像数据的每一行上的字节数。对于我们在这里构造的8位数组,它与宽度完全相同,但是当加载时,它通常舍入到4的倍数,并且可以包含未使用的填充字节。 (该函数负责所有这些,因此输入字节数组没有这样的要求。)