2011-07-04 10 views
0

これは前に出てきたかもしれませんが、以下のコードは私が修正しているMSDNの例から取ったものです。私はビットマップに関するデータを含むバッファの内容をどのように反復処理し、色を印刷することができるかを知りたい。各ピクセルは4バイトのデータですので、R G Bの値がこれらのバイトの3つを占めていると仮定しています。可能であればAは4番目のバイトです。メディアバッファからの読み込み - ポインタの算術C++の構文

反復処理中に指し示されている値を私が使用できるローカル変数に格納するために必要なポインタ算術演算(理想的にはループ内)の正しい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. 
    */ 
+0

私はIMFMediaBufferに精通していませんが、[MSDN](http://msdn.microsoft.com/en-us/library/ms696261 \(v = vs.85 \).aspx)はこう言っています。バッファに2次元の画像データ(圧縮されていないビデオフレームなど)が含まれている場合は、バッファにIMF2DBufferインタフェースを問い合わせる必要があります。 – user786653

+0

お返事いただきありがとうございます。あなたが私自身が投稿した答えによってわかるように、私は期待していた種類のポインタ算術を使って問題を解決しました。そのため、メディアバッファはメモリ内の他の配列と同様に扱うことができます – ComethTheNerd

答えて

0

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

注:(ビット0から - 31)私たちが持っているこれらの4バイトにまたがる私たちは私のコードを使用して確認することができ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であることがわかりますここでは透明度や深度の概念がないため、それぞれのピクセルは、我々が期待しているものです。

我々は4で cbBitmapDataの値を分割
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バイトです(32ビットの実際は実際には32ビットの長さは常にハードウェア全体にわたって厳密に一様ではないためです)。これを画像幅に高さを掛けた値と比較します。それらは等しいので、バッファ内にピクセルの色情報があります。

これは誰かを助けることを望みます。