0

これは前に出てきたかもしれませんが、次のコードは、私が変更している MSDN の例から取られています。ビットマップに関するデータを含むバッファーの内容を反復処理して、色を出力する方法を知りたいです。各ピクセルは 4 バイトのデータであるため、RGB 値がこれらのバイトのうちの 3 つを占め、おそらく A が 4 番目であると想定しています。

その反復中にポイントされた値を、使用できるローカル変数に格納する、必要なポインター演算 (理想的にはループ内) の正しい C++ 構文は何ですか? コンソールに出力します。

どうもありがとう

PS。これは安全ですか?または、IMFMediaBuffer の内容をより安全に読み取る方法はありますか? 代替案が見つかりませんでした。

コードは次のとおりです。

hr = pSample->ConvertToContiguousBuffer(&pBuffer); // this is the BitmapData
    // Converts a sample with multiple buffers into a sample with a single IMFMediaBuffer which we Lock in memory next...

    // IMFMediaBuffer represents a block of memory that contains media data

    hr = pBuffer->Lock(&pBitmapData, NULL, &cbBitmapData);  // pBuffer is IMFMediaBuffer
    /* Lock method gives the caller access to the memory in the buffer, for reading or writing:
    pBitmapData - receives a pointer to start of buffer
    NULL - receives the maximum amount of data that can be written to the buffer. This parameter can be NULL.
    cbBitmapData - receives the length of the valid data in the buffer, in bytes. This parameter can be NULL.
    */
4

1 に答える 1

0

私は自分で問題を解決し、ここに回答を追加して正しくフォーマットし、他の人が恩恵を受けるようにするのが最善だと考えました。基本的にこの状況では、画像データに 32 ビットを使用します。これは単なる生の色情報であるため、スキップするビットマップ ヘッダーがまだ存在しないため、メモリから raw を読み取っていることは素晴らしいことです。

注: これらの 4 バイトにわたって (ビット 0 から 31 まで) BGRA があり、コードを使用して確認できます。

  int x = 0;

    while(x < cbBitmapData){

        Console::Write("B: {0}", (*(pBitmapData + x++)));
        Console::Write("\tG: {0}", (*(pBitmapData + x++)));
        Console::Write("\tR: {0}", (*(pBitmapData + x++)));
        Console::Write("\tA: {0}\n", (*(pBitmapData + x++)));
    }

出力から、各ピクセルの A 値が 0 であることがわかります。これは、ここには透明度または深さの概念がないためです。これは期待どおりです。

また、バッファにあるのは生の画像データだけであり、他のデータがないことを確認するために、次の計算を使用しました。

Console::Write("no of pixels in buffer: {0} \nexpected no of pixels based on dimensions:{1}", (cbBitmapData/4), (m_format.imageWidthPels * m_format.imageHeightPels) );

バイト数であるため、値を 4 で割ります。前述のように、各ピクセルの幅は 4 バイトです (実際にはcbBitmapData32 ビットです。1 バイトの長さはハードウェア全体で常に厳密に均一であるとは限らないためです)。DWORDSどうやら!?)。これを、画像の幅に高さを掛けたものと比較します。それらは等しいので、バッファにはピクセルの色情報しかありません。

これが誰かに役立つことを願っています。

于 2011-07-05T07:39:27.170 に答える