4

私は初心者の開発者であり、おそらくあなたにとって些細なことであなたの助けが必要です.

このピクセル形式の画像データがあります: 256 色のパレット化された RGBA。これは FFmpeg から来て(PIX_FMT_PAL8)おり、次のように説明されています。

PIX_FMT_RGB32 は、エンディアン固有の方法で処理されます。RGBA カラーは次のようにまとめられます。

(A << 24) | (R << 16) | (G << 8) | B

これは、リトル エンディアンの CPU アーキテクチャでは BGRA として保存され、ビッグ エンディアンの CPU では ARGB として保存されます。

ピクセル形式がパレット化された RGB (PIX_FMT_PAL8) の場合、パレット化された画像データは AVFrame.data[0] に格納されます。

パレットは AVFrame.data[1] で転送され、長さは 1024 バイト (256 個の 4 バイト エントリ) で、上記の PIX_FMT_RGB32 と同じようにフォーマットされます (つまり、エンディアン固有でもあります)。AVFrame.data[1] に格納されている個々の RGB パレット コンポーネントは、0..255 の範囲内にある必要があることにも注意してください。

AVFrame 構造体には と が含まれuint8_t *data[4]int linesize[4]おり、次のように簡単に説明されています。

  • uint8_t *data[4]= ピクチャ プレーンへのポインタ
  • 4 つのコンポーネントが与えられます。それだけです。
  • 最後のコンポーネントはアルファです
  • int linesize[4]= 1 行あたりのバイト数

必要なすべてのデータを含む AVFrame 構造体がありますが、それを処理する方法がわかりません。この画像データから NSImage を作成する必要があります。

これどうやってするの?

4

1 に答える 1

1

パレット化された画像の場合、ピクセルにはパレットへのインデックスである 1 バイトの値が含まれます。パレットには 256 のエントリがあります。

ピクセルは、アドレス AVFrame.data[0] から格納されます。パレットは、アドレス AVFrame.data[1] から格納されます。

したがって、(X, Y) のピクセルの 4 バイトのピクセル値を取得するには、最初に次を使用できます。

uint8_t Index= AVFrame.data[0][X + AVFrame.linesize[0] * Y];

インデックスをパレットに取得し、次に

int RGBA= ((int*)AVFrame.data[1])[Index];

RGBA でエンコードされた値を取得します。

于 2012-02-20T09:54:28.570 に答える