2013-02-12 51 views
1

最近我有一種方法可以通過adb shell命令行將數據顯示到幀緩衝區。從幀緩衝器獲取數據我使用的命令:通過命令行拍攝的Android屏幕截圖的圖像格式

貓的/ dev /圖形/ FB0>/SD卡/截圖

現在我/ SD卡我得到的原始圖像的截圖。序來顯示此在幀緩衝器是在設備屏幕,我使用的命令:

貓/ SD卡/截圖>的/ dev /圖形/ FB0

作爲輸出我能看到屏幕截圖在我的設備屏幕上(注意:我的設備已生根,所以我可以訪問/ dev/graphics/fb0)。

現在我的問題是:我必須從命令行在屏幕上顯示RGB888格式的圖像。所以我嘗試:

貓/ SD卡/ rgbimg>的/ dev /圖形/ FB0

但隨着屏幕上的輸出,我可以看到一個白點和黑點,而不是圖像。

因此,要在幀緩衝區上顯示我的RGB888,我需要將其轉換爲文件屏幕截圖的格式。因此,如果有人嘗試過,可以告訴我上面例子中的圖片截圖的格式。

有關如何獲得此格式的任何建議也將不勝感激。提前致謝。

回答

1

貓的/ dev /繪圖/ fb0>/sdcard /屏幕截圖

該命令產生一個文件,它是RGBA,紅綠藍色的alpha。至少我假設它是一個alpha通道,我得到的每個字節在第4個字節位置都有一個FF。

我能夠使用原始文件打開4通道544x1920交錯的Photoshop中打開的原始文件,它顯示了2個屏幕的副本,一個在另一個之上。我不確定爲什麼有2個副本,也許是雙緩衝區?也許內部/外部視頻?

要將原始文件看作RGB,我將黃色通道複製到紅色,綠色到綠色和青色到藍色通道,圖像看起來就像從DDMS屏幕捕獲按鈕捕獲的圖像一樣,除了有一堆2幅圖像而不是一幅。

+0

感謝您真正處理過的信息...所以,+1對你... – Zax 2013-02-13 04:45:40

0

鑑於默認的攝像頭輸出格式爲NV21,我想它可能是用於顯示的格式(這看起來像是從攝像頭輸出的格式,可以按原樣顯示)。

如果這可以有任何幫助,Android支持的各種圖像格式列表爲here,您正在尋找的格式可能是其中之一。例如,這些格式的實現細節可以找到here

希望這會有所幫助。

1

屏幕上的圖像可能是32 bpp(bits per pixel)。只需檢查捕獲的圖像的文件大小,並將其除以(width * height)。這應該可以確定像素使用多少個字節。

如果是4個字節,則需要將RGB888圖像轉換爲ARGB或RGBA。 Afaik在alpha字節位置上的差異取決於顯示硬件,而不是Android。

ImageMagick是做這種工作的工具。例如,您可以通過

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

更具體的例子轉換RGBA圖像到png

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

由於對圖像的原始數據不包括寬度,高度,深度信息需要提供這些。

請參閱convert's manual以查找更多關於圖像轉換選項(我應該承認這不是我見過的最好的手冊)。

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() 
+0

感謝您的回覆。爲你的努力+1。我認爲這是python腳本。我會試試看。 – Zax 2013-02-13 04:48:21

+0

嘿你的代碼中「c」是什麼? – Zax 2013-02-13 04:52:31

+1

幀緩衝區或雙幀緩衝區的「副本」,因此通常2. – 2013-02-13 07:18:32