1

最近、adbシェルコマンドラインを介してフレームバッファにデータを表示する方法を手に入れました。フレームバッファからデータを取得するには、次のコマンドを使用しました:

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

/sdcard で生の画像のスクリーンショットを取得しました。これをデバイス画面であるフレーム バッファに表示するために、次のコマンドを使用しました。

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

出力として、デバイス画面にスクリーン ショットが表示されます (注: 私のデバイスはルート化されているため、/dev/graphics/fb0 にアクセスできます)。

今私の問題は次のとおりです。コマンドラインから画面にRGB888形式の画像を表示する必要があります。だから私は試しました:

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

しかし、画面上の出力として、画像の代わりに白と黒のドットが表示されます。

したがって、RGB888 をフレーム バッファーに表示するには、ファイルのスクリーン ショットの形式に変換する必要があります。したがって、誰かが試した場合は、上記の例の画像のスクリーンショットの形式を教えてください。

この形式を取得する方法に関する提案も歓迎します。前もって感謝します。

4

4 に答える 4

2

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

このコマンドは、RGBA、赤、緑、青、アルファのファイルを作成しました。少なくとも私はそれがアルファ チャンネルであると仮定しています。取得するすべてのバイトの 4 番目のバイト位置に FF があります。

raw ファイルを使用して Photoshop で raw ファイルを開くことができました 4 チャネル 544x1920 インターリーブで開き、画面の 2 つのコピーを重ねて表示しました。なぜ2つのコピーがあるのか​​ わかりません.おそらくダブルバッファですか?おそらく内部/外部ビデオですか?

raw ファイルを RGB として表示するには、黄色のチャンネルを赤に、緑を緑に、シアンを青のチャンネルにコピーします。画像は、DDMS スクリーン キャプチャ ボタンからキャプチャされた画像と同じように見えますが、 1 つだけではなく 2 つの画像のスタック。

于 2013-02-12T19:18:41.833 に答える
2

画面上の画像はおそらく 32 bpp (ビット/ピクセル) です。キャプチャした画像のファイルサイズを確認し、 で割るだけ(width * height)です。これにより、ピクセルが使用するバイト数が確実にわかります。

4 バイトの場合、RGB888 イメージを ARGB または RGBA に変換する必要があります。Afaik のアルファ バイト位置の違いは、Android ではなくディスプレイ ハードウェアに依存します。

ImageMagickは、この種の作業を行うためのツールです。たとえば、RGBA イメージをpngbyに変換できます。

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 に答える
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 に答える