在嵌入式Linux Framebuffer中截取屏幕截图

7
我正在Zoom OMAP35x Torpedo开发套件上运行嵌入式Linux。该板有一块液晶屏幕,我想能够截屏并将其转换为GIF或PNG格式。我可以通过以下方式获取原始数据:“cp /dev/fb0 screen.raw”,但是我不知道如何将图像转换为GIF或PNG格式。
我尝试使用ImageMagick的convert命令(例如:“convert -depth 8 -size 240x320 rgb:./screen.raw -swap 0,2 -separate -combine screen.png”),但是无法得到正确的图像。
有没有其他工具可以尝试?或者有没有使用ImageMagick的技巧?

“嵌入式Linux”是一个非常具体的内核版本/配置,还是仅仅是运行在嵌入式设备上的Linux的通用名称?相关链接:http://unix.stackexchange.com/questions/25063/capturing-area-of-the-screen-without-a-desktop-environment - Ciro Santilli OurBigBook.com
4个回答

11

看一下fbgrab,这是一个可以保存帧缓存内容为PNG格式的应用程序。


2
我尝试使用fbgrab,但它不支持“低端比特深度”。对于我的设备,比特深度为8。:( 不过,我看了一下fbshot - http://www.sfires.net/fbshot/。fbgrab是基于fbshot的,并且它支持8位深度。fbshot可以完美地运行。 - waffleman
fbgrab已经迁移到GitHub。我还遇到了一个问题,古老的1.2版本无法很好地处理RGB565 - 通过更新到最新版本进行修复。 - Honza Vojtěch

7

您可以将帧缓冲区直接保存到文件中,然后在任何原始图像查看器中打开它,或者尝试在线查看(例如:https://rawpixels.net/

cat /dev/fb0 > fbdump

这个在线转换器对我没用,但是在这里我找到了一个Perl脚本,可以很好地完成转换:https://www.cnx-software.com/2010/07/18/how-to-do-a-framebuffer-screenshot/ - Georg P.
2
通过转储 /dev/fb0 的方式获得几兆字节的全零内容是正常的吗? - matanster
@matanster:像这样的原始文件只是按顺序排列的每个像素。由于终端屏幕大多是黑色的,而黑色是#000,因此您将有很多零来表示黑色像素。 - Moiré

1
可能直接使用ImageMagick很难/不可能完成此操作。
Linux内核4.2文档 https://github.com/torvalds/linux/blob/v4.2/Documentation/fb/api.txt#45 表明:
像素以硬件相关的格式存储在内存中。应用程序需要知道像素存储格式,以便按硬件期望的格式将图像数据写入帧缓冲器内存中。
格式由帧缓冲区类型和视觉效果描述。某些视觉效果需要其他信息,这些信息存储在可变的屏幕信息bits_per_pixel、灰度、红色、绿色、蓝色和透明度字段中。
视觉效果描述了如何对颜色信息进行编码和组装以创建宏像素。类型描述了宏像素在内存中的存储方式。支持以下类型和视觉效果。
接下来是视觉效果和类型列表,但我无法立即理解确切的格式。
但似乎ImageMagick可能无法直接理解该格式,或者至少您需要找到所使用的格式才能确定ImageMagick选项。

0

使用cat命令获取原始帧缓冲数据

cat /dev/fb0 > fbdump.data

请注意,这是以您的帧缓冲设置为本机格式。

要转换它,可以使用ffmpeg。记得用-s设置大小和-pix_fmt设置像素格式

ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 800x480 -i fbdump.data -f image2 -vcodec png screenshot.png

您也可以在gimp中打开.data文件,但格式选项更有限。

最后,如果您的嵌入式目标支持,您还可以使用fbgrab获取屏幕截图并直接转换为png格式。

fbgrab -d /dev/fb0 screenshot.png


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接