You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pillow读取RGBA4444格式的Waltex(raw)图像?

读取Waltex格式(RGBA4444小端序)图像的解决方案

PIL的frombytes原生raw模式对Waltex这类自定义raw格式的特殊色彩空间支持有限,尤其是小端序的RGBA4444格式,需要手动解析原始像素数据并转换为PIL兼容的RGBA8888格式。

核心思路

  1. 读取文件时跳过Waltex的头部信息(包含魔数、宽高、格式标识等内容)
  2. 按小端序解析每像素的16位数据(RGBA4444标准为每像素2字节,若你提到的“8字节”为笔误;若为真实情况需调整解析逻辑)
  3. 将4位通道数据转换为8位(左移4位或乘以17实现0-255的范围映射)
  4. 组装为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:22:19