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

时间:2013-02-12 05:18:01

标签: android linux image image-processing android-ndk

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

cat / dev / graphics / fb0> / SD卡/截图

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

cat / sdcard / screenshot>的/ dev /图形/ FB0

作为输出,我可以在设备屏幕上看到屏幕截图(注意:我的设备已植根,因此我可以访问/ dev / graphics / fb0)。

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

cat / sdcard / rgbimg>的/ dev /图形/ FB0

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

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

关于如何获得此格式的任何建议也将受到赞赏。提前谢谢。

4 个答案:

答案 0 :(得分:1)

屏幕上的图像大概是32 bpp(bits per pixel)。只需检查捕获图像的文件大小,然后将其除以(width * height)即可。这应该告诉你一个像素使用多少字节。

如果是4个字节,则需要将RGB888图像转换为ARGB或RGBA。 alpha字节位置的Afaik差异取决于显示硬件,而不是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

由于您的图片的原始数据不包含您需要提供的宽度,高度,深度信息。

请参阅convert's manual以了解有关图片转换选项的更多信息(我应该承认这不是我见过的最佳手册)。

答案 1 :(得分:1)

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

您可以尝试使用此脚本在fb.raw中生成带有彩条的图像,然后将其复制到/dev/graphics/fb0(将W,H和c调整为您的硬件):

#! /usr/bin/env python

W=480
H=800

# R G B
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()

答案 2 :(得分:1)

  

cat / dev / graphics / fb0&gt; / SD卡/截图

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

我能够使用原始文件打开4通道544x1920交错显示原始文件在photoshop中打开,显示2个屏幕副本,一个在另一个上面。我不确定为什么有2个副本,也许是双重缓冲?也许内部/外部视频?

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

答案 3 :(得分:0)

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

如果这有任何帮助,Android会支持各种图片格式here,您正在寻找的格式可能就是其中之一。例如,here可以找到这些格式的实现细节!

希望这有帮助。