如何使用Pillow读取RGBA4444格式的Waltex(raw)图像?
读取Waltex格式(RGBA4444小端序)图像的解决方案
PIL的frombytes原生raw模式对Waltex这类自定义raw格式的特殊色彩空间支持有限,尤其是小端序的RGBA4444格式,需要手动解析原始像素数据并转换为PIL兼容的RGBA8888格式。
核心思路
- 读取文件时跳过Waltex的头部信息(包含魔数、宽高、格式标识等内容)
- 按小端序解析每像素的16位数据(RGBA4444标准为每像素2字节,若你提到的“8字节”为笔误;若为真实情况需调整解析逻辑)
- 将4位通道数据转换为8位(左移4位或乘以17实现0-255的范围映射)
- 组装为RGBA8888格式的像素数组,用PIL生成图像
代码实现
from PIL import Image import struct # 读取文件并解析头部(需根据Waltex实际格式调整头部逻辑) with open('Carl.waltex', 'rb') as f: # 示例头部结构:4字节魔数、2字节宽(小端)、2字节高(小端)、1字节格式标识 magic = f.read(4) width = struct.unpack('<H', f.read(2))[0] height = struct.unpack('<H', f.read(2))[0] format_id = ord(f.read(1)) # 用于区分RGBA8888/RGBA4444等格式 # 读取剩余的像素原始数据 raw_data = f.read() pixel_count = width * height pixels = [] # 处理小端序RGBA4444格式(每像素2字节) for i in range(pixel_count): pixel_bytes = raw_data[i*2 : (i+1)*2] # 小端序解析为16位无符号整数 val = struct.unpack('<H', pixel_bytes)[0] # 提取4位通道并转换为8位,若颜色偏暗可替换为*17(0x0F*17=255) r = ((val >> 0) & 0x0F) << 4 g = ((val >> 4) & 0x0F) << 4 b = ((val >> 8) & 0x0F) << 4 a = ((val >> 12) & 0x0F) << 4 pixels.extend([r, g, b, a]) # 创建并显示图像 img = Image.frombytes('RGBA', (width, height), bytes(pixels)) img.show()
注意事项
- 若显示颜色异常,说明通道位偏移顺序不符,调整
>>后的偏移数字即可(比如调换R/B的偏移值) - 若文件确实是每像素8字节的RGBA4444(极少见),将解析格式改为
<Q(小端无符号长整型),并重新调整位掩码提取对应4位数据 - 头部解析逻辑需匹配Waltex官方格式定义,避免硬编码头部长度
内容的提问来源于stack exchange,提问作者ego-lay atman-bay
相关产品推荐
相关产品推荐

