Raspberry Pi 和带单声道的帧缓冲输入
Posted
技术标签:
【中文标题】Raspberry Pi 和带单声道的帧缓冲输入【英文标题】:Raspberry Pi and framebuffer input with mono 【发布时间】:2015-02-25 07:13:03 【问题描述】:我正在尝试使用单声道在内存中渲染位图。此图像应显示在 Adafruits 2.8" touch TFT (320*240) 上。该程序是使用 Visual Studio 2013 社区版开发的。我想托管一个 ASP.NET Web Api 并显示 显示器上的一些数据。 ASP.NET 部分工作正常并呈现图像。我的想法是将图像写入帧缓冲区输入,但这样做我得到一个异常,说文件太大。我只是在写没有 BMP Header 的原始数据。有人设法做到这一点吗?也许图像的创造是 错误的。 似乎正在发生一些事情,因为显示发生了变化,我可以看到可能来自我的图像的白色区域。 我不想使用任何额外的库来保持简单。所以我的想法是直接使用FBI。有谁知道这个问题和解决方法吗?
这是我的一些代码:
using (Bitmap bmp = new Bitmap(240, 320, PixelFormat.Format16bppRgb555))
[...]
Byte[] image = null;
using(MemoryStream memoryStream = new MemoryStream())
bitmap.Save(memoryStream, ImageFormat.Bmp);
Byte[] imageTemp = memoryStream.GetBuffer();
//Remove BMP header
image = new Byte[imageTemp.Length - 54];
Buffer.BlockCopy(imageTemp, 54, image, 0, image.Length);
//153600 byte
using (FileStream fb1 = new FileStream("/dev/fb1", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
fb1.Write(image, 0, image.Length);
fb1.Close();
【问题讨论】:
我不是这里的专家(除了拥有一个 Raspi:-),但无论如何:您是否尝试过将数据写入较小的块?你确定位图的二进制数据是他帧缓冲区所期望的吗?例如。也许 BMP 数据是游程编码的,而 FB 不喜欢它,或者反过来…… 【参考方案1】:看看http://computerstruggles.blogspot.de/2013/02/how-to-program-directfb-in-c-on.html - 这个想法是安装directfb 库并通过PInvoke 从C# 使用它。该博客的作者在 C 中使用了一个迷你包装器,以使其更容易使用。顺便说一句,您为什么不喜欢安装额外的库并从其他人为您完成的工作中获利?
【讨论】:
好的,我可以安装 DirectFB 并使用 PInvoke。我在 Windows 下开发,对 linux 不太了解。所以我只知道在 Windows 中使用 Dll 的 PInvoke。我认为用 C 编写一个包装器并在那里实现所有结构是太多了。如何仅通过 C# 代码和 PInvoke 使用 directfb? 对不起,我不知道比我已经告诉你的更多。当 C# 是唯一可供选择的编程语言时,也许 Pi 并不是最好的编码设备。【参考方案2】:当 MemoryStream 重新分配内存时,您可能会耗尽内存。当它需要增长时,它的大小会增加一倍。有了这么大的写入,内部缓冲区可能超过了可用内存。请参阅Why does C# memory stream reserve so much memory? 了解更多信息。
【讨论】:
以上是关于Raspberry Pi 和带单声道的帧缓冲输入的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Raspberry Pi 上使用 C++ 将接收到的 UDP 音频数据正确写入 ALSA
c_cpp for raspberry pi 2视频模块输入