C#将位图转换为led显示的字节数组

时间:2018-01-09 17:31:01

标签: c# arrays bitmap bits

我有一个LED显示屏,我可以发送一个字节数组,一个代表一个LED。显示器有9216个LED。字节数组长1152字节(96 x 96/8)。 前12个字节代表顶行,接下来的12个字节代表第二行,...... 我希望使用System.Drawing.Bitmap进行绘制并将其发送到显示器。

如何轻松将像素信息转换为此格式?

var bmp = new Bitmap(96, 96);
using (var g = Graphics.FromImage(bmp))
{
    g.Clear(Color.White);
    var p = new Pen(Color.Black);
    var p1 = new Point(1, 0);
    var p2 = new Point(0, 0);
    g.DrawLine(p, p1, p2);
}

var imageBytes = Convert(bmp);

转换器实现示例(位的问题)

public static byte[] Convert(Bitmap bmp)
{
    var size = bmp.Width * bmp.Height / 8;
    var buffer = new byte[size];

    var i = 0;
    for (var y = 0; y < bmp.Height; y++)
    {
        for (var x = 0; x < bmp.Width; x++)
        {
            var color = bmp.GetPixel(x, y);
            if (color.B != 255 || color.G != 255|| color.R != 255)
            {
                var pos = i / 8;
                var bitInByteIndex = 1;

                buffer[pos] = (byte)(1 << bitInByteIndex);
            }
            i++;
        }
    }

    return buffer;
}

1 个答案:

答案 0 :(得分:0)

@谢谢你@dlatikay!

我唯一的问题是哪一个是LSB和MSB

LSB?

buffer[pos] |= (byte)(1 << 7 - bitInByteIndex);

MSB?

buffer[pos] |= (byte)(1 << bitInByteIndex);

转换器工作

public static byte[] Convert(Bitmap bmp)
{
    var size = bmp.Width * bmp.Height / 8;
    var buffer = new byte[size];

    var i = 0;
    for (var y = 0; y < bmp.Height; y++)
    {
        for (var x = 0; x < bmp.Width; x++)
        {
            var color = bmp.GetPixel(x, y);
            if (color.B != 255 || color.G != 255|| color.R != 255)
            {
                var pos = i / 8;
                var bitInByteIndex = x % 8;

                buffer[pos] |= (byte)(1 << 7 - bitInByteIndex);
            }
            i++;
        }
    }

    return buffer;
}