2012-08-14 22 views
12

AndroidでPixelFormatを混同しています。PixelFormatについて混乱しています

私のデバイスはMotorola Defyです。アンドロイド2.3で

  • RGB_565何の略かgetWindowManager().getDefaultDisplay().getPixelFormat()戻り:

    私は2つの質問があります。

   2^(8*3) = 2^24 = 16M 

しかしRGB_565形式は2バイト(16ビット)を有している:私の知る限りでは、私のデバイスは、16M色を有し、それは、(アルファチャンネルまたは4)3を意味し、画素あたりのバイトピクセルごとに、何が65K色の略:

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

なぜ、getPixelFormat()が1ピクセルあたり3(またはRGBAのような4)バイトのフォーマットを返さないのですか?ディスプレイドライバの問題なのでしょうか? PixelFormatRGBA_8888(またはアナログ)に設定できますか?アンドロイド4.1(カスタムROM)で

  • getPixelFormat()戻り。しかし、この価値は文書化されていません。それは何のために立つのですか?実際、この状況では、定数4と同じ効果があります。しかし、this discussionから、はRGBA_8888を表しています(ただし、そのステートメントの証拠はありません)。では、実際のデバイスの画面の形式をどのように把握できますか?また、私はAndroid 2.2上に中国語のデバイスが1台見つかりました。それもPixelFormat ですが、実際のフォーマットはです(モトローラとして)。

私はこれらの質問を探知して何も見つかりませんでした。私が見つけたのはnexus 7 also has 5 formatです。

更新:

私は方法getWindow().setFormat()を見つけたが、それは実際にメインピクセルフォーマットを変更しません。

答えて

6

私はすべてのご質問に決定的な答えを見つけることができなかったことを、事前に認めなければならないのに私は、この議論に私の2セントを追加します。

、なぜgetPixelFormat()ピクセルあたり(RGBA様または4)3 バイトのフォーマットを返さない ?ディスプレイドライバの問題なのでしょうか? PixelFormatRGBA_8888(またはアナログ)を設定することはできますか?

私はちょっとあなたがここで尋ねていることについて少し困惑しています。 getPixelFormat()の戻り値は、アクティブなピクセル形式を識別する方法を提供する単なる整数です。数値に圧縮されたデータを表すことを意味するものではありません(例:MeasureSpec)。残念ながら、私はあなたが期待したものとは異なるものが返される理由について説明していません。ハードウェアの観点からは制限がないように見えるか、またはネイティブ実装で定義された定数がJavaのものと一致しないため、OSの決定によるものです。 4をピクセル形式に戻しているという事実は、モトローラが定義を混乱させた場合、必ずしも実際にはRGB_565であるとは限りません。サイドノートでは

:私は実際に前のAndroidにずれ定数の定義に遭遇しましたが、私は現在だけを確認するために、正確に...

を思い出すことができないが、それはピクセルをプリントアウトする価値があるかもしれません実行時にフォーマットの詳細。実際にJava PixelFormatの値を使用していても一致しないネイティブ定数が定義されている場合、このように '実際の'形式を明らかにすることができます。 getPixelFormatInfo(int format, PixelFormat info)メソッドを使用します。これは、単純にネイティブ実装の実際の値の取得を委任します。アンドロイド4.1(カスタムROM)で

、getPixelFormat()は5を返しますが、この 値は文書化されていないです。それは何のために立つのですか?

前述のように、ネイティブコードで定義された定数は、Javaのものと一致しないか、まったく定義されないことがあります。これはおそらくそのような場合です。あなたは、いくつかは、それが何を表すかを見つけるために掘り行う必要があるでしょうが、それはかなり簡単です:あなたはPixelFormat.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)

、あなたは見つけることができます彼らは非常にうまく(彼らがすべきである)追加します。また、謎の5の意味を示しています。これはBGRA_8888です。 RGBA_8888の変形です。

ちなみに、上記のgetPixelFormatInfo(...)メソッドを使用して、この整数値のピクセル形式の詳細を、識別子として5を渡して判断してみてください。何が返されるのか興味深いでしょう。私はそれがBGRA_8888の定義に一致する値を示すことを期待しており、Motorolaのボード上のリンクされた議論で与えられたものと同様であることを期待しています。

+0

あなたの答えに感謝します。私はあなたに賞金を授与しました。 – ArtemStorozhuk

+0

@アスター:あなたを助けてくれてありがとう。私の提案を何とかしようとしましたか?実際に返されるデータが何であるかは興味があります。 –

+1

getPixelFormatInfoは、結果をBitPerPixel(32)とbytesPerPixel(4)の2つのフィールドを持つPixelFormatオブジェクトに格納します。 – xastor

4

motodevフォーラムのthisスレッドによると、戻り値5はRGBA_8888に対応します。スレッドは、PixelFormatのドキュメントが不完全であり、古くなっていると述べ、links to a bugを提出しました。 は、しかし、そのバグへのリンクは現在404

を返します。また、私はあそこRGBA_8888が値1

割り当てられているとして、その主張をサポートしている(4.1) PixelFormat source code内の任意のものを見つけるように見えることができませんでした

Nexus 7とGalaxy Nexusで同じ出力を見ているので、この値はMotorolaやその他のデバイスに固有の値です。

EDIT:これについてGoogle社員に電子メールを送り、彼はMHの回答と先にリンクしたモトローラのフォーラムのスレッドに示されているようにBGRA_8888に5が対応していると教えてくれました。彼は、ドキュメントの問題のバグを提出することをお勧めします。which I have done後ではなく早く行動が取れるように、バグ報告にスターを付けてください。

+1

これは5がRGBA_8888を表しているということではありません(その人からのプルーフリンクもありません)。実際には、フォーマット4(RGB_565)は、ICSまたはJelly Bean上で正常に動作します(Android 2.3と同じ)。 RGBA_8888よりも色に問題があるかもしれません。 – ArtemStorozhuk

+1

私が2番目の点で言ったように、私は彼の主張の証拠も見つけられませんでした。しかし、スレッドの他の人は、RGBX_8888またはRGBA_8888のいずれかであることを示すいくつかのテストを実行しました。 –

+0

お返事ありがとうございます(+1)。 – ArtemStorozhuk

3

RGBA_8888は、以下の附属書に示すように1に対応します。

mPixelFormatに関連するコードに行くと、次のようになります。

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

つまり、何らかの理由で、デバイスがハードウェア機能以上のOSの判断により、RGB_565として扱われています。 実際、それは私に好奇心を感じさせる。

ギャラクシーネクサスとネクサス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

+0

あなたは何を見つけようとしているのですか?このことは、この詳細を知っているという事実以外に何か違いをもたらしますか? –

+0

フォーマット5は何のために表示されるのですか?デバイスの画面の実際のフォーマットにビューのフォーマットを設定するにはどうすればいいですか? – ArtemStorozhuk

関連する問題