我正在尝试将二维数组转换为 DDS 并将其保存到文件中。数组中充满了 Color 结构(每个结构都有红色、绿色、蓝色和 alpha 分量)。一旦我将数组转换为正确的格式,我确信将它保存到文件部分不会有问题。
如果我能找到一个很好的资源来解释如何做。
如果有人能指出我正确的方向,我将不胜感激。
我正在尝试将二维数组转换为 DDS 并将其保存到文件中。数组中充满了 Color 结构(每个结构都有红色、绿色、蓝色和 alpha 分量)。一旦我将数组转换为正确的格式,我确信将它保存到文件部分不会有问题。
如果我能找到一个很好的资源来解释如何做。
如果有人能指出我正确的方向,我将不胜感激。
在 DirectDraw 中,您可以通过在结构中设置某些字段DDSURFACEDESC
并将其传递给接口的CreateSurface
方法,从内存中的数据创建表面IDirectDraw
。
首先,您需要通过将字段设置为以下一组标志来告诉 DirectDrawDDSURFACEDESC
结构的哪些字段包含正确的信息:dwFlags
DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH
哦,这仅适用于系统内存表面,因此可能需要DDSCAPS_SYSTEMMEMORY
在字段中添加标志ddsCaps.dwCaps
(如果 DirectDraw 默认不会这样做)。
然后在字段中指定像素数据数组的起始地址lpSurface
。如果您的缓冲区是连续的,只需将 设置lPitch
为 0。否则,您可以在此处设置正确的间距(两个后续扫描线的开头之间的字节距离)。
在字段中设置正确的像素格式,在和 中设置ddpfPixelFormat
正确的位深度和dwRGBBitCount
RGB 掩码。dwRBitMask
dwGBitMask
dwBBitMask
然后将 设置为lXPitch
像素的字节数(RGB 为 3)。这取决于您使用的像素格式。
然后将填充的结构传递进去CreateSurface
,看看它是否有效。
当您以这种方式创建表面时,请记住 DirectDraw 不会自己管理其数据缓冲区,并且Release
在您调用表面时不会释放此内存。当表面不再使用此内存时,您需要自己释放它。
另一方面,如果您希望将此像素数据放在显存中,则需要以通常的方式创建一个离屏表面,然后将其锁定,将您的像素复制到显存中自己的缓冲区(您会发现它的地址lpSurface
,记得记lPitch
数!),然后解锁。