我正在制作视频游戏中时光倒流。我拍的所有照片都是以4:3宽高比拍摄的.jpg图像。 2592x1944分辨率。我希望他们在1920x1080时都是16:9。
我写了一个小脚本来做这个,但过程不是很快。我花了大约17分钟来裁剪和调整750张图片。我总共需要处理大约300,000个,并且可能会在大约50,000个批次中进行处理。这是每批18小时45分钟,计算总数超过4.5天。
所以有人知道我可以加速这个程序吗?
这是我写的bash脚本:
#!/bin/bash
mkdir cropped
for f in *.JPG
do
convert $f -resize 1920x1440 -set filename:name '%t' cropped/'%[filename:name].JPG' #Resize Photo, maintain aspect ratio
convert cropped/$f -crop 1920x1080+0+$1 -set filename:name '%t' cropped/'%[filename:name].JPG' #Crop to 16:9 aspect ratio, takes in $1 argument for where to begin crop
done
echo Cropping Complete!
在循环中的每一行之前和之后放置一些echo命令会发现调整大小比裁剪花费的时间多得多,我想这并不奇怪。我尝试使用mogrify -path cropped -resize 1920x1440! $f
代替convert $f -resize
,但速度似乎没有太大差异。
那么,我可以用任何方式加快运行时间吗?
奖励积分如果你能告诉我一个简单的方法,可以在程序运行时给出一个简单的进度指示(例如“750个文件中的421个,完成56.13%”)。
EXTRA BONUS POINTS 如果您可以添加命令从每个帧输出.mp4文件,可以在SONY Vegas等软件程序中编辑。我已经设法使用这些照片中的mencoder制作视频文件(.avi),但最终的视频无法在我尝试过的任何视频编辑器中使用。
答案 0 :(得分:5)
有些事情会浮现在脑海中......
首先,不要每张图像启动两次ImageMagick,一次调整大小,一次调整就可以一次完成两个操作。所以,我只会做一个
,而不是你的两个convert
命令
convert image.jpg -resize 1920x1440 -crop 1920x1080+0+$1 cropped/image.jpg
其次,我没有看到你使用set
命令做了什么,有文件名,但是你可以在shell中做到这一点。
第三,我建议你使用GNU Parallel(我每天定期处理超过65,000张图像)。它易于安装,并确保您支付的所有可爱CPU核心保持忙碌状态。使用它的最简单方法是,不是运行命令,而是回显它们并将它们输入parallel
#!/bin/bash
mkdir cropped
for f in *.jpg
do
echo convert \"$f\" -resize 1920x1440 -crop 1920x1080+0+$1 cropped/\"$f\"
done | parallel
echo Cropping Complete!
最后,如果您想要一个进度表,或者指示完成了多少工作以及剩下要做什么,请使用--eta
选项(eta =预计到达时间)到parallel
告诉你有多少工作和剩余时间。
当您对parallel
充满信心时,您可能会像这样运行整个过程:
parallel --eta convert {} -resize 1920x1440 -crop 1920x1080+0+32 cropped/{} ::: *.jpg
我创建了750张与你相同尺寸的图像并以这种方式运行它们需要我的中等规格iMac 55秒来调整大小并裁剪很多 - YMMV。请添加评论并说明您的工作方式 - parallel
的处理时间。
答案 1 :(得分:2)
首先,为了加快不要回显到屏幕的内容,请将其回显到文件中,如果您想知道状态读取文件(使用tail命令轻松完成),严重来说这已经更快了。然而,这似乎并不是您计划的真正瓶颈。 我可以推荐的主要是并行运行它,是否有任何理由可以在#4之前裁剪+调整pic#1000的大小?如果没有,那么修改脚本以接收一些参数,该参数指定它应该使用哪些文件,然后使用不同的参数运行几次,这应该减少时间大约相同的CPU核心数量(减去一些硬盘驱动器) I / O时间)。 关于你的第一个奖金问题,你可以做这个代码的变体
TOTAL=`ls -1|wc -l` #get the total number of files (you can change this to the files parameter I mentioned above
SOFAR=0 #How many files you've done so far
for f in *.JPG
do
((SOFAR++))
echo "done so far $SOFAR out of $TOTAL"
done
答案 2 :(得分:0)
使用
-define jpeg:size=1920x1440
选项和-resize一起使用。如果您有较旧版本的ImageMagick(抱歉,我不知道语法何时更改),请使用
-size 1920x1440
选项和-resize。