wctZLib压缩波形图像的Python解压缩与显示问题求助
解决思路与步骤
核心问题:你解压后得到的并非PNG/JPG这类标准图像文件,而是原始波形采样数值数据,因此无法用PIL直接打开。结合wctZLib这个自定义压缩标识,按以下步骤处理:
1. 确保wctZLib解压正确
标准zlib解压可能需要调整参数适配自定义压缩逻辑,尝试以下几种解压方式:
import zlib import json with open('wave.json','r') as f: data = json.load(f) bytes_data = bytearray.fromhex(data['waveform_data'][2:]) # 尝试多种zlib解压参数,覆盖不同压缩变种 try: # 标准带zlib头的压缩 decompressed = zlib.decompress(bytes_data) except zlib.error: try: # 原始deflate格式(无zlib头) decompressed = zlib.decompress(bytes_data, wbits=-15) except zlib.error: # 尝试兼容gzip格式 decompressed = zlib.decompress(bytes_data, wbits=16+zlib.MAX_WBITS) print(f"解压后字节长度: {len(decompressed)}")
2. 解析波形数值
波形数据通常是连续的采样数值(如16位整数),用numpy解析成可处理的数组:
import numpy as np # 根据设备实际采样格式调整dtype,比如uint16、int32等 wave_array = np.frombuffer(decompressed, dtype=np.int16) print(f"采样点数: {len(wave_array)}") print(f"数值范围: {wave_array.min()} ~ {wave_array.max()}")
如果输出的数值范围符合设备预期(比如传感器的常规输出区间),说明解析正确。
3. 绘制波形图像
用matplotlib将数值绘制成波形图,替代直接用PIL打开的方式:
import matplotlib.pyplot as plt plt.figure(figsize=(12, 6)) plt.plot(wave_array) plt.title(f"Waveform: {data['start_dt']} - {data['end_dt']}") plt.xlabel("Sample Index") plt.ylabel("Amplitude") plt.show() # 如需保存为图像文件 plt.savefig("waveform_output.png")
额外排查点
- 检查解压后的数据头部是否有元数据(如采样率、通道数),这类自定义压缩可能会附加额外信息,需要先剥离再解析数值;
- 对比数据库中多组数据的解压结果,找出字节结构的共性规律。
内容的提问来源于stack exchange,提问作者Dest
相关产品推荐
相关产品推荐

