之前可能会出现这种情况,但以下代码来自我正在修改的MSDN示例。我想知道如何迭代缓冲区的内容,其中包含有关位图的数据并打印出颜色。每个像素是4个字节的数据,所以我假设R G B值占这些字节中的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.
*/
答案 0 :(得分:0)
我自己解决了这个问题,并认为最好在这里添加答案,以便正确格式化,也许其他人可以从中受益。基本上在这种情况下,我们使用32位的图像数据,最棒的是我们从内存中读取原始内容,因此还没有要跳过的Bitmap标头,因为这只是原始颜色信息。
注意:在这4个字节中,我们有(从0到31位)B G R A,我们可以使用我的代码验证:
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) );
我们将cbBitmapData
的值除以4,因为它是字节的计数,并且正如前面提到的每个像素,我们的宽度为4字节(实际上是32位DWORDS
因为硬件上的字节长度并不总是严格一致的!?)。我们将其与图像宽度乘以其高度进行比较。它们是相同的,因此我们在缓冲区中只有像素颜色信息。
希望这有助于某人。