Yuriy Leonov
Yuriy Leonov

Reputation: 504

How to get "alpha" layer data from ".dds" image based on x and y using pyglet?

Given:

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"
    img.save(filename="white_small.dds")

So, for an example if I want to know "Is pixel under x=2 and y=3 transparent in white_small.png" 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. 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) about x and y coordinate from .dds data?

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

Upvotes: 1

Views: 202

Answers (0)

Related Questions