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

Pillow保存8位BMP无法启用RLE压缩的技术咨询

8位索引BMP的RLE压缩保存问题:Pillow不支持,改用ImageMagick解决

问题场景

我要写脚本把生成的图像和另一张图合并后存成8位BMP,供ESP32微控制器读取。因为ESP32内存有限,必须压缩,所以专门给它做了RLE解码逻辑。用的是Pillow 9.1.0及以上版本,已知它能读取RLE压缩的BMP,但保存时遇到了问题。

尝试的Pillow代码(未生效)

按照文档设置compression=1(对应RLE)保存8位索引模式的BMP,但实际没触发压缩:

import io
from PIL import Image
import matplotlib.pyplot as plt

img_buf = io.BytesIO() # 将Matplotlib生成的图像转成PIL格式
plt.savefig(img_buf, format='png', transparent=True) 
graph = Image.open(img_buf)

# 创建8位索引画布
new_image = Image.new('P', (600, 448), (255, 255, 255)) # 'P'代表8位索引模式
new_image.paste(img, (0, 0)) # 插入第一张图像
new_image.paste(graph, (0, 200)) # 在y=200位置插入第二张图像

# 按文档设置compression=1,但未启用RLE压缩
new_image.save("../output/priceeast.bmp", compression=1)

经过测试确认:Pillow目前仅支持读取RLE压缩的BMP,不支持保存时生成RLE压缩的8位索引BMP。

可行方案:调用ImageMagick实现RLE压缩

改用ImageMagick的命令行工具,通过subprocess调用,成功生成带RLE压缩的8位索引BMP:

import subprocess

# 转换为8位索引模式并启用RLE压缩
subprocess.call('magick ../output/priceeast.png -type palette -compress RLE ../output/priceeast.bmp ', shell=True)

内容的提问来源于stack exchange,提问作者Anders

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:00:58