1

鉴于:

white_small.png,包含RGBA。
还有white_small.dds一个是从前一个生成的。
JFYI:它是通过这种方式生成的,使用魔杖

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")

因此,例如,如果我想知道“x=2 和 y=3 下的像素是否透明white_small.png”,则可以轻松完成。

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']

很清楚:png_transparency_data[(y-1)][(x-1)]这是 0 - 表示它是透明的。

现在关于white_small.dds. 如果white_small.dds将在 GIMP/any_editor 中打开 - 将显示以下图片:(只是用户想象看到此字节为白色 :))

[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']

让我们看看white_small.dds使用 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']

在这里我不知道如何将这些数据映射到坐标。

问题:

如何从.dds数据中获取有关 x 和 y 坐标的信息(透明度/颜色)?

PS:我知道,dxt3以 4:1 的比例压缩图像,但这并没有给我解决我的问题的线索 :(

4

0 回答 0