Я пытаюсь преобразовать 2D-массив в DDS и сохранить его в файл. Массив полон цветных структур (каждая из которых имеет красный, зеленый, синий и альфа-компонент). Как только я получу массив в правильном формате, я уверен, что сохранение его в файл не будет проблемой.
Я в порядке либо с использованием библиотеки lib (если ее лицензия позволяет мне использовать ее в проекте с закрытым исходным кодом и работает как в Linux, так и в Windows), либо в ручном режиме, если я могу найти хороший ресурс, объясняющий, как сделай это.
Если кто-нибудь может указать мне правильное направление, я был бы очень благодарен.
В DirectDraw вы можете создать поверхность из данных в памяти, настроив определенные поля в DDSURFACEDESC
структура и передача его CreateSurface
метод IDirectDraw
интерфейс.
Сначала вам нужно указать DirectDraw, какие поля DDSURFACEDESC
структура содержит правильную информацию, установив 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
на количество байтов вашего пикселя (3 для RGB). Это зависит от формата пикселя, который вы используете.
Затем передайте заполненную структуру в CreateSurface
и посмотреть, если это работает.
Когда вы создаете поверхность таким образом, имейте в виду, что DirectDraw сам не будет управлять своим буфером данных и не освободит эту память после вызова Release
на вашей поверхности. Вы должны освободить эту память самостоятельно, когда она больше не используется поверхностью.
Если вы хотите, чтобы эти данные пикселей были помещены в видеопамять, с другой стороны, вам нужно создать внеэкранную поверхность обычным способом, а затем заблокировать ее, скопировать пиксели в свой собственный буфер в видеопамяти (вы найдете ее адрес в lpSurface
поле, и не забудьте взять lPitch
в счет!), а затем разблокировать его.
Других решений пока нет …