この議論に 2 セント追加しますが、あなたのすべての質問に対する決定的な答えを見つけることができなかったことを前もって認めておく必要があります。
getPixelFormat()
では、 1 ピクセルあたり 3 (または RGBA のように 4) バイトのフォーマットを返さないのはなぜでしょうか? ディスプレイドライバーの問題か何かですか?RGBA_8888 (またはアナログ)PixelFormat
に設定できます
か?
ここであなたが正確に何を求めているのか、私は少し困惑しています。の戻り値はgetPixelFormat()
、アクティブなピクセル形式を識別する方法を提供する単なる整数です。数値に圧縮されたデータを表すことを意図したものではありません (たとえば、 のようにMeasureSpec
)。残念ながら、あなたが期待していたものとは異なる結果が返された理由について、私には説明がありません。ハードウェアの観点からは制限がないように見えるため、OS の決定が原因であるか、ネイティブ実装で定義されている定数が Java の定数と一致していない可能性があります。4
モトローラが定義を台無しにした場合、ピクセル形式として返されているという事実は、それが実際に RGB_565 であることを必ずしも意味しません。
余談ですが、私は実際に Android で以前に定数定義の不整合に遭遇したことがありますが、現在正確にどこを思い出すことはできません...
確認のために、実行時にピクセル形式の詳細を出力する価値があるかもしれません。PixelFormat
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)
};
出典: hardware.h
(121-148 行目)
値を で定義されている値と比較すると、PixelFormat.java
(当然のことながら) 非常にうまく加算されていることがわかります。5
また、謎の BGRA_8888の意味も示しています。RGBA_8888 の亜種。
ところで、前述のメソッドを使用して、識別子としてgetPixelFormatInfo(...)
渡すことにより、この整数値のピクセル形式の詳細を決定してみることをお勧めします。5
何が返されるかを見るのは興味深いでしょう。BGRA_8888 の定義に一致する値が表示されることを期待しているため、Motorola ボードのリンクされたディスカッションで示されている値と同様です。