Почему эти красные и зеленые квадраты отображаются на моем PNG?

У меня есть файл VTF, который внутри VTFEdit выглядит так:

Я попытался преобразовать его в PNG в Python, используя следующий код:

      import texture2ddecoder, numpy, cv2
from PIL import Image

img_width =  64
img_height = 64
encoded_binary = open('bracketsTest.vtf','rb').read()

#decompressing dxt5 (compression used for this VTF file) to get actual pixel colors, returns BGRA bytes
decoded_binary = texture2ddecoder.decode_bc5(encoded_binary, img_width, img_height)

#creating RGBA png, converting from BGRA (no support for BRGA in PIL it seems)
dec_img = Image.frombytes("RGBA", (img_width, img_height), decoded_binary, 'raw', ("BGRA"))

dec_img.show()
dec_img.save('testpng.png')

И в результате получилось вот такое изображение:

Поскольку полученное изображение выглядит не так, как в VTFEdit, очевидно, что-то пошло не так. Я подозревал, что это была проблема с цветовым каналом, идущим от BGRA (VTF по умолчанию являются BRGA + texture2ddecoder создает байты BRGA при распаковке) в RGBA, поэтому я попробовал следующий код для преобразования изображения из RGBA в BRGA:

      # trying to convert png back to BGRA
image = cv2.imread('testpng.png')
image_bgra = cv2.cvtColor(image, cv2.COLOR_RGBA2BGRA)
cv2.imshow('image',image_bgra)

Но результирующее изображение получилось практически таким же, как и до преобразования, только с синими квадратами вместо красных. Что здесь происходит и как я могу это исправить? Есть ли название для этих странных квадратов?

1 ответ

DXT5 на самом деле известен как Block Compression 3 (BC3). В моем случае я неправильно предположил, что BC5 = DXT5, поэтому декомпрессия была неправильной ( лучшее объяснение см. в этой статье в Википедии ).я изменил строкуdecoded_binary = texture2ddecoder.decode_bc5(encoded_binary, img_width, img_height)кdecoded_binary = texture2ddecoder.decode_bc3(encoded_binary, img_width, img_height) и результирующее изображение выглядело так:

Вверху все еще есть несколько странных квадратов, но удаление/игнорирование информации заголовка и данных эскизов с низким разрешением, похоже, исправляют это:

Знай свои алгоритмы декомпрессии!!!

Другие вопросы по тегам