我正在尝试将2d数组转换为DDS并将其保存到文件中。数组充满了颜色结构(每个都有红色,绿色,蓝色和alpha分量)。一旦将数组设置为正确的格式,就可以确定将其保存到文件部分不会有问题。
我可以为此使用一个库(只要它的许可证允许我在一个封闭的源项目中使用它并且可以在Linux和Windows上运行)就可以了,或者可以手动进行,如果我能找到一个很好的资源来解释如何做吧。
如果有人能指出正确的方向,我将非常感激。
最佳答案
在DirectDraw中,可以通过在DDSURFACEDESC
结构中设置某些字段并将其传递给CreateSurface
接口(interface)的IDirectDraw
方法,从内存中的数据创建表面。
首先,需要通过将DDSURFACEDESC
字段设置为以下标志集来告诉DirectDraw dwFlags
结构的哪些字段包含正确的信息:DDSD_WIDTH | DDSD_HEIGHT | DDSD_PIXELFORMAT | DDSD_LPSURFACE | DDSD_PITCH
。
哦,这仅适用于系统内存表面,因此可能需要在DDSCAPS_SYSTEMMEMORY
字段中添加ddsCaps.dwCaps
标志(如果DirectDraw默认情况下不这样做)。
然后,在lpSurface
字段中指定像素数据数组的开始地址。如果您的缓冲区是连续的,只需将lPitch
设置为0。否则,您可以在此处设置正确的音高(两个后续扫描线的起点之间的距离(以字节为单位))。
在ddpfPixelFormat
字段中设置正确的像素格式,在dwRGBBitCount
中设置正确的位深度,在dwRBitMask
,dwGBitMask
和dwBBitMask
中设置RGB掩码。
然后将lXPitch
设置为像素的字节数(对于RGB为3)。这取决于您使用的像素格式。
然后将填充的结构传递到CreateSurface
中,看看它是否有效。
当以这种方式创建表面时,请记住DirectDraw不会自己管理其数据缓冲区,并且一旦在表面上调用Release
就不会释放此内存。当表面不再使用它时,您需要自己释放此内存。
另一方面,如果您希望将此像素数据放置在视频内存中,则需要以通常的方式创建一个屏幕外表面,然后将其锁定,将像素复制到视频内存中自己的缓冲区中(您会找到它的地址在lpSurface
字段中,请记住在计数中加入lPitch
!),然后将其解锁。
关于c++ - 在C++中从头开始创建DirectDraw Surface,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17123947/