如何在ImageMagick中复用源图批量裁剪合成且无需临时文件?
解决方法:一次加载源图,多次裁剪叠加
你可以通过单次加载源图像到内存,再对其进行多次克隆裁剪的方式,避免重复输入源图路径,同时完全不用临时文件。无论是用magick(推荐的新版命令)还是旧版convert都能实现,下面是具体实现:
用magick的写法(推荐)
magick "$INPUT" \ \( -clone 0 -crop W1xH1+X1+Y1 +repage \) \ \( -clone 0 -crop W2xH2+X2+Y2 +repage \) \ \( -clone 0 -crop W3xH3+X3+Y3 +repage \) \ \( -clone 0 -crop W4xH4+X4+Y4 +repage \) \ -delete 0 \ -background none -compose over -flatten "$DESTINATION"
关键部分解释:
$INPUT:只需要写一次,命令一开始就把源图加载到内存,编号为0-clone 0:复制已加载的源图(编号0),这样每次裁剪都是基于内存里的源图副本,不用重新读文件-crop WxH+X+Y:替换成你的裁剪参数,X/Y是裁剪区域的左上角坐标(如果省略,默认从左上角开始)+repage:清除裁剪后残留的画布信息,避免叠加时出现偏移-delete 0:删除原始的源图(因为我们已经克隆出需要的裁剪区域了)-background none -compose over -flatten:把所有裁剪区域按顺序叠加,背景设为透明,用over混合模式(可根据需求替换其他模式)
用convert的写法(兼容旧版)
如果坚持用convert,逻辑完全一致:
convert "$INPUT" \ \( -clone 0 -crop W1xH1+X1+Y1 +repage \) \ \( -clone 0 -crop W2xH2+X2+Y2 +repage \) \ \( -clone 0 -crop W3xH3+X3+Y3 +repage \) \ \( -clone 0 -crop W4xH4+X4+Y4 +repage \) \ -delete 0 \ -background none -compose over -flatten "$DESTINATION"
补充说明:
- 如果叠加需要特定位置,可以在每个裁剪的
+repage后加-geometry +X+Y,指定该裁剪区域最终的叠加坐标 - 若仅需两两叠加(而非全部平铺),可以用
-composite替代-flatten,注意顺序:先指定底层图,再指定上层图,最后执行-composite
内容的提问来源于stack exchange,提问作者user3310334
相关产品推荐
相关产品推荐

