如何使用pyglet从基于x和y的“.dds”图像中获取“alpha”层数据?

2024-04-19 22:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

给定:

white_small.png,包含RGBA。
还有white_small.dds是由前一个生成的。
JFYI:它是通过这种方式生成的,使用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")

所以,举个例子,如果我想知道“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/任何一个编辑器中打开,将显示以下图片:(只是用户的想象中看到这个字节) 白色:))

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

让我们使用pyglet来研究white_small.dds

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坐标的信息(透明度/颜色)?

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


Tags: imageimgfordatapnglinesmallpyglet