1

我正在尝试将二维数组转换为 DDS 并将其保存到文件中。数组中充满了 Color 结构(每个结构都有红色、绿色、蓝色和 alpha 分量)。一旦我将数组转换为正确的格式,我确信将它保存到文件部分不会有问题。

如果我能找到一个很好的资源来解释如何做。

如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

2

在 DirectDraw 中,您可以通过在结构中设置某些字段DDSURFACEDESC并将其传递给接口的CreateSurface方法,从内存中的数据创建表面IDirectDraw

首先,您需要通过将字段设置为以下一组标志来告诉 DirectDrawDDSURFACEDESC结构的哪些字段包含正确的信息:dwFlagsDDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH

哦,这仅适用于系统内存表面,因此可能需要DDSCAPS_SYSTEMMEMORY在字段中添加标志ddsCaps.dwCaps(如果 DirectDraw 默认不会这样做)。

然后在字段中指定像素数据数组的起始地址lpSurface。如果您的缓冲区是连续的,只需将 设置lPitch为 0。否则,您可以在此处设置正确的间距(两个后续扫描线的开头之间的字节距离)。

在字段中设置正确的像素格式,在和 中设置ddpfPixelFormat正确的位深度和dwRGBBitCountRGB 掩码。dwRBitMaskdwGBitMaskdwBBitMask

然后将 设置为lXPitch像素的字节数(RGB 为 3)。这取决于您使用的像素格式。

然后将填充的结构传递进去CreateSurface,看看它是否有效。

当您以这种方式创建表面时,请记住 DirectDraw 不会自己管理其数据缓冲区,并且Release在您调用表面时不会释放此内存。当表面不再使用此内存时,您需要自己释放它。

另一方面,如果您希望将此像素数据放在显存中,则需要以通常的方式创建一个离屏表面,然后将其锁定,将您的像素复制到显存中自己的缓冲区(您会发现它的地址lpSurface,记得记lPitch数!),然后解锁。

于 2014-03-28T13:44:46.417 回答