2012-08-14 53 views
12

我對Android上的PixelFormat感到困惑。混淆PixelFormat

我的設備是Motorola Defy。

我有兩個問題:

  • 在Android 2.3 getWindowManager().getDefaultDisplay().getPixelFormat()回報什麼代表RGB_565
   2^(8*3) = 2^24 = 16M 

但是RGB_565格式具有2個字節(16位):據我知道我的設備具有16M顏色,即裝置3(或4的alpha通道)每像素字節每個像素的什麼代表65K顏色:

   2^(8*2) = 2^16 = 65K 

那麼,爲什麼getPixelFormat()不會返回每像素3(或4像RGBA)字節的格式?它是顯示驅動程序問題還是什麼?我可以將PixelFormat設置爲RGBA_8888(或模擬)嗎?

  • 在Android 4.1(定製ROM),getPixelFormat()返回。但是這個價值是沒有記錄的。它代表什麼?實際上,在這種情況下,效果與常數4相同。但從this discussion我發現,代表RGBA_8888(但沒有證據表明)。那麼我怎麼才能弄清楚真實的格式的設備的屏幕?我還在Android 2.2上找到了一箇中文設備,它也有PixelFormat ,但真實格式是(與我的摩托羅拉一樣)。

我搜索了這些問題,什麼也沒找到。我發現的唯一的事情就是nexus 7 also has 5 format

更新:

我找到方法getWindow().setFormat()但它實際上並沒有改變主像素格式。

回答

6

我只是我的兩分錢加入討論,雖然我應提前承認,我無法找到確鑿你所有的問題。

那麼,爲什麼getPixelFormat()不會每像素3(或4類似RGBA) 字節返回格式?它是顯示驅動程序問題還是什麼?我可以設置 PixelFormatRGBA_8888(或模擬)嗎?

我對你到底在問什麼有點困惑。 getPixelFormat()的返回值只是一個整數,它提供了一種識別活動像素格式的方法;它並不意味着代表壓縮成數字的任何數據(例如與MeasureSpec一樣)。不幸的是,我沒有解釋爲什麼不同的產品會返回比您預期的要多。我最好的猜測應該是由於操作系統的決定,因爲從硬件角度來看似乎沒有限制,或者本地實現中定義的常量與Java中的常量不匹配。事實上,如果摩托羅拉搞砸了這些定義,那麼您以像素格式獲得4並不一定意味着它確實是RGB_565。

在一個側面說明:其實我已經遇到之前的Android錯位常量定義,雖然我目前還不能記得究竟在何處?

只是爲了確認,它可能是值得打印出像素運行時格式細節。如果確實定義了一個使用Java值但不匹配的本地常量,則可以通過這種方式顯示「真實」格式。使用getPixelFormatInfo(int format, PixelFormat info)方法,該方法只是委託從本地實現中檢索實際值。

在Android 4.1(自定義ROM)上,getPixelFormat()返回5.但是這個 值沒有記錄。它代表什麼?

如前所述,有時在本地代碼中定義的常量與在Java中定義的常量不匹配,或根本沒有定義。這可能是這樣的情況。你必須做一些挖掘,以找出究竟意味着什麼,但它是相當簡單:

/** 
* pixel format definitions 
*/ 

enum { 
    HAL_PIXEL_FORMAT_RGBA_8888   = 1, 
    HAL_PIXEL_FORMAT_RGBX_8888   = 2, 
    HAL_PIXEL_FORMAT_RGB_888   = 3, 
    HAL_PIXEL_FORMAT_RGB_565   = 4, 
    HAL_PIXEL_FORMAT_BGRA_8888   = 5, 
    HAL_PIXEL_FORMAT_RGBA_5551   = 6, 
    HAL_PIXEL_FORMAT_RGBA_4444   = 7, 
    /* 0x8 - 0xF range unavailable */ 
    HAL_PIXEL_FORMAT_YCbCr_422_SP  = 0x10,  // NV16 
    HAL_PIXEL_FORMAT_YCrCb_420_SP  = 0x11,  // NV21 (_adreno) 
    HAL_PIXEL_FORMAT_YCbCr_422_P  = 0x12,  // IYUV 
    HAL_PIXEL_FORMAT_YCbCr_420_P  = 0x13,  // YUV9 
    HAL_PIXEL_FORMAT_YCbCr_422_I  = 0x14,  // YUY2 (_adreno) 
    /* 0x15 reserved */ 
    HAL_PIXEL_FORMAT_CbYCrY_422_I  = 0x16,  // UYVY (_adreno) 
    /* 0x17 reserved */ 
    /* 0x18 - 0x1F range unavailable */ 
    HAL_PIXEL_FORMAT_YCbCr_420_SP_TILED = 0x20,  // NV12_adreno_tiled 
    HAL_PIXEL_FORMAT_YCbCr_420_SP  = 0x21,  // NV12 
    HAL_PIXEL_FORMAT_YCrCb_420_SP_TILED = 0x22,  // NV21_adreno_tiled 
    HAL_PIXEL_FORMAT_YCrCb_422_SP  = 0x23,  // NV61 
    HAL_PIXEL_FORMAT_YCrCb_422_P  = 0x24,  // YV12 (_adreno) 
}; 

Source: hardware.h (lines 121-148)

如果你要比較在PixelFormat.java中定義的值,你會發現他們加起來非常好(因爲他們應該)。它也顯示了神祕的5的含義,即BGRA_8888;一個RGBA_8888的變種。

順便說一下,您可能需要嘗試使用上述getPixelFormatInfo(...)方法通過傳入5作爲標識符來確定此整數值的像素格式詳細信息。看到返回的內容會很有趣。我期望它顯示符合BGRA_8888定義的值,因此類似於摩托羅拉板上鍊接討論中給出的值。

+0

感謝您的回答 - 我向您頒發了一筆賞金。 – ArtemStorozhuk 2012-08-23 10:54:05

+0

@Astor:很高興幫助你。你有沒有嘗試我的任何建議?我會有興趣看看實際返回的數據。 – 2012-08-25 04:58:23

+1

的getPixelFormatInfo放在一個的PixelFormat對象,它具有2個字段其結果:bitsPerPixel(32)和bytesPerPixel(4)。 – xastor 2012-09-28 19:01:55

4

根據motodev論壇上的this線程,返回值5對應於RGBA_8888。該線程指出PixelFormat的文檔不完整且過時,並且已爲其提交了links to a bug 然而,鏈接到錯誤,現在返回一個404

此外,我似乎無法找到在PixelFormat source code(4.1)的任何事情,支持索賠,因爲那邊RGBA_8888賦值爲1

我的猜測是,這個值是摩托羅拉和其他一些設備的特定值,因爲我在Nexus 7和Galaxy Nexus上看到了相同的輸出。

編輯:我通過電子郵件向Google員工瞭解了這一點,他告訴我說5對應BGRA_8888,正如MH的回答以及我之前鏈接到的摩托羅拉論壇主題所示。他建議我爲文檔問題which I have done提交一個錯誤。請爲錯誤報告加上星號,以便儘早採取行動。

+1

這是不正確的,5個代表RGBA_8888(有一個從那個傢伙甚至沒有證據的鏈接)。 Actally格式4(RGB_565)在ICS或Jelly Bean上正常工作(與Android 2.3相同)。如果它是RGBA_8888比我可能會遇到色彩問題。 – ArtemStorozhuk 2012-08-16 15:07:18

+1

正如我在第二點中所說的,我也找不到他的主張的證據。但是,線程中的其他人運行了一些測試,表明它是RGBX_8888或RGBA_8888。 – 2012-08-16 16:00:42

+0

無論如何感謝您的回覆(+1)。 – ArtemStorozhuk 2012-08-16 19:42:23

3

RGBA_8888對應於1,可以在下面的附件中看到。

如果轉到與mPixelFormat相關的代碼,可以找到以下代碼。

// Following fields are initialized from native code 
private int mPixelFormat; 

這意味着,由於某種原因,您的設備已被視爲RGB_565由於OS決定超過硬件功能。其實,這讓我感到好奇。

有趣的是,Galaxy Nexus和Nexus 7的描述並沒有太多共同之處。 GNN7

public static final int RGBA_8888 = 1; 
public static final int RGBX_8888 = 2; 
public static final int RGB_888  = 3; 
public static final int RGB_565  = 4; 

@Deprecated 
public static final int RGBA_5551 = 6; 
@Deprecated 
public static final int RGBA_4444 = 7; 
public static final int A_8   = 8; 
public static final int L_8   = 9; 
@Deprecated 
public static final int LA_88  = 0xA; 
@Deprecated 
public static final int RGB_332  = 0xB; 
+0

感謝您的答覆(+1),但它並不能幫助我在所有:( – ArtemStorozhuk 2012-08-18 11:34:53

+0

你正在嘗試找出?這是否使別的其他比知道這個細節的事實,有區別嗎? – 2012-08-18 11:37:03

+0

什麼格式5代表什麼?我怎樣才能查看的格式設置爲設備屏幕的實際格式? – ArtemStorozhuk 2012-08-18 11:40:15