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
相关产品推荐
相关产品推荐

