DDS в PNG – бесплатный конвертер изображений онлайн
DDS (DirectDraw Surface) - это формат файла, используемый в игровой индустрии для хранения текстур. Однако этот формат файлов не предназначен для широкого спектра использования, что затрудняет его использование в других областях.
PNG (Portable Network Graphics) — это графический формат файлов для хранения изображений. PNG сочетает преимущества форматов JPEG и GIF и обеспечивает хранение большей информации о графических элементах.
Конвертация DDS в PNG может быть необходима в случае, если нужно использовать текстуры не только в игровых движках, но и в других программах или на веб-сайтах.
Пример кода для конвертации DDS в PNG может выглядеть так:
python
import io
import struct
from PIL import Image
with open('example.dds', 'rb') as f:
dds_data = f.read()
header = struct.unpack('<4s5I10x', dds_data[:28])
width = header[2]
height = header[3]
mipmaps = header[7]
if mipmaps > 0:
# если у DDS-файла более одного мипмапа, то следующие мипмапы
# идут сразу после базового изображения, в порядке убывания размера
offset = 28
size = len(dds_data) - offset
for level in range(mipmaps):
with io.BytesIO(dds_data[offset:offset+size]) as mip_data:
image = Image.frombytes('RGBA', (width, height), mip_data.read(), 'dds')
image.save(f'level{level}.png')
width = max(width // 2, 1)
height = max(height // 2, 1)
size = ((width+3)//4) * ((height+3)//4) * 8
offset += size
else:
# если мипмапов нет, то базовое изображение идет сразу после заголовка
with io.BytesIO(dds_data[28:]) as image_data:
image = Image.frombytes('RGBA', (width, height), image_data.read(), 'dds')
image.save('example.png')
В этом примере мы считываем содержимое файла `example.dds`, извлекаем заголовок DDS и вытаскиваем из него ширину, высоту и количество мипмапов. Если у DDS есть более одного мипмапа, мы перебираем их и конвертируем каждый в отдельный PNG-файл, уменьшая при этом размеры изображения в соответствии с его уровнем мипмапа. Если же мипмапов нет, то мы конвертируем базовое изображение и сохраняем его в файл `example.png`.
Конвертирование DDS в PNG с помощью PIL библиотеки происходит через метод `frombytes`, который позволяет создать новый объект изображения из байтового объекта, содержащего данные об изображении в конкретном формате (в данном случае DDS). Метод `save` сохраняет изображение в новый файл с указанным расширением (в данном случае PNG).