我有一个脚本可以拍摄4张照片并复制它们以生成8张小图片。该脚本还为输出添加了背景。
这是我的期望:
http://img11.hostingpics.net/pics/831624stack.png
我有一个效果很好的代码。但它需要保存多个临时图像。
所以我一直在寻找是否可以合并脚本的命令来只获得一个图像保存操作。目标是使脚本更快完成。
//Make image smaller:
convert /home/pi/images/*.png -resize 487x296 -flop \
-set filename:f "/home/pi/imagesResized/%t%p" '%[filename:f]'.png
//Make one column from 4 images:
montage /home/pi/imagesResized/*.png -tile 1x4 \
-geometry +0+15 -background none /home/pi/line.png
//Duplicate to two columns:
montage /home/pi/line.png /home/pi/line.png -tile 2x1 \
-geometry +45+0 -background none /home/pi/photos.png
//Add the background image:
suffix=$(date +%H%M%S)
montage /home/pi/photos.png -geometry +20+247 \
-texture /home/pi/data/background_photo.png \
/home/pi/photo_${suffix}.jpg
答案 0 :(得分:1)
由于我没有您的图像或纹理或尺寸,我会告诉您类似的东西让您适应......
制作一些输入图像:
convert -size 500x400 xc:black 1.png
convert -size 500x400 xc:red 2.png
convert -size 500x400 xc:green 3.png
convert -size 500x400 xc:blue 4.png
和背景纹理:
convert -size 2000x2000 xc:gray +noise gaussian background.png
现在按照你的要求做,但没有中间文件到磁盘:
montage [1234].png -background none -tile 1x4 -geometry +0+15 miff:- |
convert -background none :- -size 15 xc:none -clone 0 +append png: |
convert -gravity center background.png :- -composite z.png
第一行将4个图像一个放在另一个上面,并通过管道将合并结果以MIFF
(多图像文件格式)发送到下一个命令。第二个命令从管道中读取一个图像,并附加一个15像素宽的“spacer”,然后复制第一列图像(使用clone
)并通过另一个管道写入PNG
到下一个命令。最后一个命令将8个小图像组合在一起并将它们放在背景上,居中。
如果图像的右侧列应该是反映的左列 - 很难从您的可怜示例中看出哪个显示黑色扁平框 - 您可能需要更改命令的第二行
convert -background none :- -size 15 xc:none -clone 0 +append png: |
到
convert -background none :- -size 15 xc:none \( -clone 0 -flop \) +append png: |
答案 1 :(得分:0)
这是另一个答案。它从Mark Setchell的方法中获得灵感。在这里,我想出了一个新的命令管道。不同的是,我......
montage
命令(Mark在其管道中使用了1 montage
和2 convert
},而我作为输入,我在另一个答案t{1,2,3,4}.png
中使用了Ghostscript命令创建的四个图像。
为了创建一个合适的背景图像,我使用了Mark的命令,虽然修改了:我使图像稍微小一点,这样OP中的-texture
运算符可以通过有意义的使用:
convert -size 200x200 xc:gray +noise gaussian background.png
然后我对所有三个命令/脚本进行了基准测试,......
对于基准测试,我确实每次重复100次。 这样做的时候,我在一个单独的终端窗口中大致同时启动了每个脚本/命令。 测试机器上的CPU有4个核心。 因此,当命令并行运行时,它们必须处理相同的CPU和I / O负载,相互竞争资源。 这是最公平的" ad-hoc性能测试设置我可以提出。
我还确认3次测试(photo_test1.jpg
,ms+kp_test2.jpg
和kp_test3.jpg
)创建的输出文件按像素(几乎)相同。
如果输出切换到PNG(而不是JPEG,OP要求的方式),那么这三个方法之间的这些小差异也会消失。
结果如下:
mkdir ./imagesResized
time for i in {1..100}; do
convert t*.png -resize 487x296\! -flop \
-set filename:f "./imagesResized/%t%p" '%[filename:f]'.png
montage ./imagesResized/*.png -tile 1x4 -geometry +0+15 \
-background none line.png
montage line.png line.png -tile 2x1 -geometry +45+0 \
-background none photos.png
montage photos.png -geometry +20+247 \
-texture background.png \
photo_test1.jpg
done
<强>结果:强>
真实2m13.471s
用户1m54.306s
sys 0m14.340s
将此作为100%的时间消耗。
time for i in {1..100}; do
montage t[1234].png -resize 487x296\! -flop -background none \
-tile 1x4 -geometry +0+15 miff:- \
| montage :- -background none -clone 0 -tile 2x1 -geometry +45+0 miff:- \
| montage :- -geometry +20+247 -texture background.png ms+kp_test2.jpg ;
done
<强>结果:强>
真实1分50.125秒
用户1m32.453s
sys 0m16.578s
与原始命令相比,耗时约为83%。
time for i in {1..100}; do
convert t*.png -flop -resize 487x296\! \
-background none \
-size 0x15 \
xc:white \
-duplicate 7 \
-insert 0 \
-insert 2 \
-insert 3 \
-insert 5 \
-insert 6 \
-insert 8 \
-insert 9 \
-append \
\( +clone -size 90x0 xc:white +swap \) \
+append \
-transparent white \
miff:- \
| montage :- -geometry +65+247 -texture background.png kp_test3.png
done
<强>结果:强>
真实1m34.786s
用户1m20.595s
sys 0m13.026s
与原始命令相比,耗时约为72%。