将RGBA转换为ARGB像素格式

时间:2017-05-27 04:52:34

标签: python python-3.x image-processing bitmask argb

我尝试将图片转换为以下DDS格式:

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

D3DFMT_A4R4G4B4 16位ARGB像素格式,每个通道有4位。

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

# 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

问题:

  • 我的RGBA到ARGB转换错了吗?
  • 为什么我没有得到理想的结果?

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

1 个答案:

答案 0 :(得分:0)

@ 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

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

输出:enter image description here
预期:enter image description here
资料来源:enter image description here