所以我有一个x8r8g8b8格式的IDirect3DSurface9,它包含后台缓冲区的内容。当我在上面调用LockRect时,我可以访问一个包含pBits的结构,一个指向我假设的像素的指针,以及整数Pitch(我对其目的非常不清楚)。
如何阅读各个像素?
Visual Studio 2008 C ++
答案 0 :(得分:1)
锁定区域存储在D3DLOCKED_RECT中。我没有使用过这个,但是文档说它是“表面一行中的字节数”。实际上人们通常称之为“跨步”(一些术语解释为in the MSDN)。
例如,如果一个像素有4个字节(XRGB的每个组件为8位),并且纹理宽度为7,则图像通常存储为8 * 4个字节而不是7 * 4个字节,因为内存可以是如果数据是DWORD对齐的,则访问速度更快。
因此,为了读取像素[x,y],你必须阅读
uint8_t *pixels = rect.pBits;
uint32_t *mypixel = (uint32_t*)&pixels[rect.Pitch*y + 4*x];
其中4是像素的大小。 *myPixel
将是我示例中像素的内容。
答案 1 :(得分:0)
是的,您可以像这样访问像素的各个RGB分量。
不使用像素的第一个字节,但是每个像素使用4个字节更有效,因此每个像素在32位边界上对齐(这也就是为什么有音高)。
在您的示例中,未使用x,但请注意,还有其他像素格式,例如ARGB,它将alpha值(透明度)存储在第一个字节中。有时颜色也会反转(BGR而不是RGB)。如果你不确定哪个字节对应于什么颜色,一个好的技巧是创建一个完全是红色,绿色或蓝色的纹理,然后检查4个字节中的哪个具有255的值。