我正在尝试将2d数组转换为DDS并将其保存到文件中。数组中充满了颜色结构(每个结构都有红色,绿色,蓝色和alpha分量)。一旦我将数组格式化为正确的格式,我确定将其保存到文件部分不会有问题。
我可以使用lib(只要它的许可允许我在一个封闭的源项目中使用它并在Linux和Windows上运行)或手动执行它,如果我能找到一个好的资源解释如何做到这一点。
如果有人能指出我正确的方向,我真的很感激。
答案 0 :(得分:2)
在DirectDraw中,您可以通过在DDSURFACEDESC
结构中设置某些字段并将其传递给CreateSurface
接口的IDirectDraw
方法,从内存中的数据创建表面。 / p>
首先,您需要通过将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
,就不会释放此内存。当表面不再使用时,你需要自己释放这个记忆。
如果你想将这个像素数据放在视频内存中,另一方面,你需要以通常的方式创建一个屏幕外表面,然后将其锁定,将像素复制到视频内存中自己的缓冲区(你&# 39;在lpSurface
字段中找到它的地址,并记住在计数中取lPitch
!),然后将其解锁。