如何使用CLI(ImageMagick)叠加合并黑/白、红/白两张单色图
实现方案
你的判断完全正确:先将红/白通道图中的白色区域设置为完全透明,再叠加到底层黑/白通道图上,就能完美还原3色e-ink屏幕的实际显示效果,整个逻辑和你物理写屏的图层顺序完全一致:
- 黑/白图的黑色像素对应屏幕黑色显示,作为整个复合图的底层
- 红/白图的红色像素对应屏幕红色显示,因为白色被抠成透明,叠上去时只会覆盖底层对应位置的内容
- 两张图共有的白色区域会透出底层黑图的白色,对应屏幕的纯白显示
不会出现内容错位、颜色偏差的问题。
ImageMagick 实现命令
假设你的两个输入文件分别是:
black_channel.png:黑/白单色通道图,纯黑、纯白无杂色red_channel.png:红/白单色通道图,纯红、纯白无杂色
ImageMagick 7(新版,树莓派系统默认安装版本)
magick black_channel.png \ \( red_channel.png -transparent white \) \ -gravity NorthWest \ -composite \ output.png
参数说明:
-transparent white:将红图中所有纯白色像素设置为100%透明,叠加时仅保留红图中原有的红色像素-gravity NorthWest:指定两张图的左上角为对齐锚点,保证同分辨率的两张通道图完全重合,不会出现偏移-composite:执行图层叠加操作,将处理好的带透明通道的红图叠加到底层黑图上
ImageMagick 6(旧版本)
仅需将入口命令从magick替换为convert即可,逻辑完全一致:
convert black_channel.png \ \( red_channel.png -transparent white \) \ -gravity NorthWest \ -composite \ output.png
常见问题优化
- 如果生成的通道图存在轻微颜色偏移、不是绝对纯净的正红/纯白,可以给透明操作加颜色容差,避免出现白边:把参数改成
-transparent -fuzz 10% white,表示将和纯白色差值在10%范围内的近白像素全部设为透明 - 输出格式不受限制:如果需要给网站展示用,直接修改输出文件后缀为
.jpg/.bmp即可,ImageMagick会自动转码,不需要额外调整参数;需要压缩文件大小的话,可以加-quality 90参数控制JPG输出质量 - 叠加结果和物理写屏效果完全匹配:当某个位置同时属于黑图的黑色、红图的红色时,最终会显示为红色,和你先写黑图、再覆盖红图的硬件写屏逻辑没有任何差异,不需要额外调整颜色映射
轻量替代方案(可嵌入现有树莓派脚本)
如果不想单独调用ImageMagick命令,用Python的Pillow库几行代码就能完成同样的叠加逻辑,方便和你现有的待办日程生成流程整合:
from PIL import Image # 加载两张通道图,统一转成带透明通道的RGBA模式 black_layer = Image.open("black_channel.png").convert("RGBA") red_layer = Image.open("red_channel.png").convert("RGBA") # 遍历红图像素,将纯白色位置设为透明 red_pixels = red_layer.getdata() transparent_pixels = [] for r, g, b, a in red_pixels: if r == 255 and g == 255 and b == 255: transparent_pixels.append((r, g, b, 0)) else: transparent_pixels.append((r, g, b, a)) red_layer.putdata(transparent_pixels) # 图层叠加,去掉透明通道后保存为网站通用的JPG格式 final_img = Image.alpha_composite(black_layer, red_layer) final_img.convert("RGB").save("todo_display.jpg", quality=90)
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

