【问题标题】:C# convert bitmap to byte array for a led displayC# 将位图转换为 LED 显示屏的字节数组
【发布时间】:2018-01-09 17:31:00
【问题描述】:

我有一个 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;
}

【问题讨论】:

  • 看起来已经很不错了。您能否详细说明“位问题”,以便我们知道在哪里寻找?它可能像buffer[pos] |= (byte)(1 &lt;&lt; bitInByteIndex); 一样简单,因此每个字节可以设置多个位。
  • pos 可以; bitInByteIndex 应该是 x%8 (模)然后。根据硬件的 LSB/MSB 可选地反转字节。
  • 您可能想要:for (var x = 0; x

标签: c# arrays bitmap bits


【解决方案1】:

@谢谢@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;
}

【讨论】:

  • 移位运算符有higher precedence而不是加法/减法,所以它应该是(byte)(1 &lt;&lt; (7 - bitInByteIndex));你在“MSB”下写的意思是最高有效位将对应于位图的正确像素。 IMO 其他变体更有可能。由于您不会因交换而面临损坏风险,因此您也可以同时测试这两种变体。
猜你喜欢
  • 2010-09-26
  • 1970-01-01
  • 2018-05-06
  • 2013-01-14
  • 2013-07-29
  • 2012-11-09
  • 2011-06-26
相关资源
最近更新 更多