通过命令行拍摄的Android屏幕截图的图像格式

最近我有办法通过adb shell命令行将数据显示到帧缓冲区。 为了从帧缓冲区获取数据,我使用了下面的命令:

cat / dev / graphics / fb0> / sdcard /截图

现在在我的/ SD卡我有一个原始的图像截图。 为了显示在设备屏幕的帧缓冲区,我使用了命令:

cat / sdcard / screenshot> / dev / graphics / fb0

作为一个输出,我可以看到屏幕截图在我的设备屏幕上(注意:我的设备是根源,所以我可以访问/ dev / graphics / fb0)。

现在我的问题是:我必须从命令行在屏幕上显示RGB888格式的图像。 所以我试过了:

cat / sdcard / rgbimg> / dev / graphics / fb0

但作为屏幕上的输出,我可以看到一个白色和黑色的点,而不是图像。

所以为了在帧缓冲区上显示我的RGB888我需要将其转换为文件屏幕截图的格式。 因此,如果有人尝试过,可以告诉我上面例子中的图片截图的格式。

任何关于如何获得这种格式的build议也将不胜感激。 提前致谢。

cat / dev / graphics / fb0> / sdcard /截图

这个命令产生了一个RGBA的文件,红绿蓝的alpha。 至少我假设它是一个alpha通道,我得到的每个字节在第四个字节位置都有一个FF。

我能够得到原始文件打开在Photoshop中使用原始文件打开4通道544×1920交错,其中显示屏幕的两个副本,一个在另一个之上。 我不确定为什么有2个副本,也许是双缓冲区? 也许内部/外部视频?

要将原始文件视为RGB,我将黄色通道复制到红色,绿色到绿色和青色到蓝色通道,图像看起来就像从DDMS屏幕捕获按钮捕获的图像,除了有一个堆叠的2张图片,而不仅仅是一张。

屏幕上的图像可能是32 bpp( 每个像素的位数 )。 只需检查捕获的图像的文件大小,并将其除以(width * height) 。 这应该可以确定一个像素使用多少个字节。

如果是4个字节,则需要将RGB888图像转换为ARGB或RGBA。 Afaik在alpha字节位置上的差异取决于显示硬件,而不是Android。

ImageMagick是做这种工作的工具。 例如,您可以将RGBA图像转换为png

 convert -size 'width'x'height' -depth 8 filename.rgba filename.png 

更具体的例子是

 convert -size 680x1209 -depth 8 phone_decor.rgba phone_decor.png 

由于您的图像的原始数据不包括宽度,高度,深度信息,您需要提供这些信息。

请参阅转换手册,以找到更多关于图像转换选项(我承认这不是我见过的最好的手册)。

这是依赖于设备,但很可能你需要RGBA。 从帧缓冲区获得的原始图像也可以包含多个副本(可以通过检查文件大小来计算出多少个副本)。

你可以尝试这个脚本来生成一个带有彩条的图像,然后你可以复制到/dev/graphics/fb0 (使W,H和c适应你的硬件):

 #! /usr/bin/env python W=480 H=800 # RGB COLORS = [ "\xff\x00\x00", "\x00\xff\x00", "\x00\x00\xff", "\xff\xff\x00", "\x00\xff\xff", "\xff\x00\xff", ] ALPHA = "\xff" BLACK = "\x00\x00\x00\xff" N = len(COLORS) def color(x): for i in range(N): if x <= (i+1)*W/N: return COLORS[i] f = open('fb.raw', 'wb') for c in range(2): for y in range(H): if c == 0: for x in range(W): f.write(color(x)+ALPHA) else: f.write(BLACK) f.close() 

鉴于默认的摄像头输出格式是NV21,我想这可能是用于显示的格式(这看起来似乎是从摄像机输出的格式,可以按原样显示)的格式。

如果这可以得到任何帮助, 这里列出了Android支持的各种图像格式,而您要查找的格式可能就是其中之一。 这些格式的实现细节可以在这里找到例如!

希望这可以帮助。