1

最近我找到了一种通过 adb shell 命令行将数据显示到帧缓冲区的方法。为了从帧缓冲区中获取数据,我使用了以下命令:

猫 /dev/graphics/fb0 > /sdcard/screenshot

现在在我的 /sdcard 中,我得到了一个原始图像截图。为了在作为设备屏幕的帧缓冲区上显示它,我使用了命令:

猫 /sdcard/screenshot > /dev/graphics/fb0

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

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

猫 /sdcard/rgbimg > /dev/graphics/fb0

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

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

任何有关如何获得此格式的建议也将不胜感激。提前致谢。

4

4 回答 4

2

屏幕上的图像可能是 32 bpp(每像素位数)。只需检查捕获图像的文件大小并将其除以(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 的手册以了解有关图像转换选项的更多信息(我应该承认这不是我见过的最好的手册)。

于 2013-02-12T12:48:56.360 回答
2

猫 /dev/graphics/fb0 > /sdcard/screenshot

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

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

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

于 2013-02-12T19:18:41.833 回答
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()
于 2013-02-12T19:05:46.590 回答
0

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

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

希望这可以帮助。

于 2013-02-12T09:52:19.240 回答