将 RGBA 转换为 ARGB 像素格式

Convert RGBA to ARGB pixel format

我正在尝试将图像转换为以下 DDS 格式:

| Resource Format | dwFlags  | dwRGBBitCount | dwRBitMask | dwGBitMask | dwBBitMask | dwABitMask |
+-----------------+----------+---------------+------------+------------+------------+------------+
| D3DFMT_A4R4G4B4 | DDS_RGBA | 16            | 0xf00      | 0xf0       | 0xf        | 0xf000     |

D3DFMT_A4R4G4B4 16-bit ARGB pixel format with 4 bits for each channel.

我有这个 python 代码(使用 Wand 库):

# source is jpeg converted to RGBA format (wand only supports RGBA not ARGB)
blob = img.make_blob(format="RGBA")

for x in range(0, img.width * img.height * 4, 4):
    r = blob[x]
    g = blob[x + 1]
    b = blob[x + 2]
    a = blob[x + 3]

    # a=255 r=91 g=144 b=72
    pixel = (a << 12 | r << 8 | g << 4 | b) & 0xffff

我得到的第一个像素是 64328,但我期待 62868

问题:

我的代码的预期输出(左)与实际输出(右):

@MartinBeckett 关于 scaling down 源像素从 8 位到 4 位的评论。我试图搜索如何做到这一点,并最终找到了解决方案。

简单地右移4位所以8-4=4。最终代码为:

r = blob[x]     >> 4
g = blob[x + 1] >> 4
b = blob[x + 2] >> 4
a = blob[x + 3] >> 4

pixel = (a << 12 | r << 8 | g << 4 | b) & 0xffff

尽管输出与预期输出之间仍然存在非常非常小的差异。 (有差异的部分)

输出:
预期:
资料来源: