14

Android のPixelFormatについて混乱しています。

私のデバイスは Motorola Defy です。

2 つの質問があります。

  • Android 2.3では、 RGB_565を表す4getWindowManager().getDefaultDisplay().getPixelFormat()が返されます。私の知る限り、私のデバイスには16M色があります。つまり、1 ピクセルあたり 3 (またはアルファ チャネルでは 4) バイトです。
                2^(8*3) = 2^24 = 16M

ただし、RGB_565フォーマットは 1 ピクセルあたり 2 バイト (16 ビット) で、65K色を表します。

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

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

  • Android 4.1 (カスタム ROM) では、5getPixelFormat()を返します。しかし、この値は文書化されていません。それは何の略ですか?実際、この状況では効果は定数と同じです。しかし、この議論から、私は5が を表すことを発見しました(しかし、その声明の証拠はありません)。では、デバイスの画面の実際の形式をどのように把握できますか? また、Android 2.2 で5を持つ中国のデバイスを 1 つ見つけましたが、実際の形式は(私の Motorola のように) 4です。4RGBA_8888PixelFormat

これらの質問をグーグルで検索しましたが、何も見つかりませんでした。私が見つけた唯一のことは、nexus 7 にも 5 フォーマットがあることです。

アップデート:

メソッドを見つけましgetWindow().setFormat()たが、実際にはメインのピクセル形式は変更されません。

4

3 に答える 3

8

この議論に 2 セント追加しますが、あなたのすべての質問に対する決定的な答えを見つけることができなかったことを前もって認めておく必要があります。

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

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

余談ですが、私は実際に Android で以前に定数定義の不整合に遭遇したことがありますが、現在正確にどこを思い出すことはできません...

確認のために、実行時にピクセル形式の詳細を出力する価値があるかもしれません。PixelFormatJava値を使用するが一致しないネイティブ定数が実際に定義されている場合、この方法で「実際の」形式を明らかにすることができます。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 ボードのリンクされたディスカッションで示されている値と同様です。

于 2012-08-22T08:00:50.993 に答える
4

motodev フォーラムのこのスレッドによると、戻り値 5 は RGBA_8888 に対応します。スレッドには、PixelFormat のドキュメントが不完全で古くなっていると記載されており、それに対して提出されたバグへのリンクがあります。ただし、そのバグへのリンクは 404 を返すようになりました。

さらに、 RGBA_8888 には値 1 が割り当てられているため、その主張をサポートするPixelFormat ソース コード(4.1)には何も見つからなかったようです。

私の推測では、Nexus 7 と Galaxy Nexus で同じ出力が表示されているため、この値は Motorola とその他のデバイスに固有のものであると思われます。

編集: これについて Google の従業員にメールを送信したところ、MH の回答と以前にリンクした Motorola フォーラムのスレッドに示されているように、5 が BGRA_8888 に対応しているとのことでした。彼は、ドキュメンテーションの問題についてバグを報告することを勧めまし。バグレポートにスターを付けて、アクションが遅かれ早かれ行われるようにしてください。

于 2012-08-16T14:54:32.607 に答える
3

以下の付録でわかるように、RGBA_8888 は 1 に対応します。

mPixelFormat に関連するコードに移動すると、次のことがわかります。

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

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

興味深いことに、Galaxy Nexus と Nexus 7 の説明にはあまり共通点がないように感じられます。GN N7

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;
于 2012-08-18T11:20:56.610 に答える