0
\$\begingroup\$

Given:

Examples are provided using python, but it's not matter.

There is white_small.png, contains RGBA.
And there is white_small.dds which was generated from previous one.
JFYI: it was generated by this way, using wand

from wand import image
with image.Image(filename="white_small.png") as img:
    img.flip()  # it just requred for more convenient using in pyglet scripts
    # flip is not important for further case
    img.compression = "dxt3"  # or "dxt5"
    img.save(filename="white_small.dds")

So, for an example if I want to know transparent information for pixel x=2 and y=3. It could be easily done.

import pyglet
img_png = pyglet.image.load("white_small.png")  # 16*16
png_transparency_data = [
    img_png.data[3::4][line * 16: (line + 1) * 16 - 1]  # take every 4-th byte from RGBA
    for line in range(16)
]
# png_transparency_data is
# [b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
#  b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff']

It's quite clear: png_transparency_data[(y-1)][(x-1)] which is 0 - means it's transparent.

Now about white_small.dds(which is vertical flipped). If white_small.dds will be open in GIMP/any_editor - following picture will be shown: ( just user imagination to see this bytes in white color :) )

[b'\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff',
 b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00']

Let's look into white_small.dds using pyglet:

import pyglet
img = pyglet.image.load("white_small.dds")  # 16*16
dds_all_data = [img.data[line * 16: (line + 1) * 16 - 1] for line in range(16)]
# dds_all_data is
[b'\x00\x05\xff\x8f\xff\xc0\x0f\xe0\xff\xff\x00\x00\x00\x01\x05',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\xff\x8f\xff\xc0\x0f\xe0\xff\xff\x00\x00\x00\x01\x05',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\xff\x8f\xff\xc0\x0f\xe0\xff\xff\x00\x00\x00\x01\x05',
 b'\x00\x05\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
 b'\x00\x05\xff\x8f\xff\xc0\x0f\xe0\xff\xff\x00\x00\x00\x01\x05']

And here I have no idea how to map this data to coordinates.

Question:

How to get information(transparency/color) from .dds data?

PS: I know, that dxt3/dxt5 compress image in ration 4:1, but it doesn't give me a clue for solving my question :(

I've read this title and it says:
About DXT3:

alpha is a 64-bit unsigned integer, from which a four-bit alpha value is extracted for a texel at location (x,y) in the block using:

        alpha(x,y) = bits[4*(4*y+x)+3 .. 4*(4*y+x)+0]

About DXT5:

    bits is a 48-bit unsigned integer, from which a three-bit control code
    is extracted for a texel at location (x,y) in the block using:

        code(x,y) = bits[3*(4*y+x)+2 .. 3*(4*y+x)+0]

But it's still not enought clear for me.

source white_small.png - https://i.stack.imgur.com/QnpJS.png

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.