5

我正在制作一个视频游戏中时光倒流。我拍摄的所有照片都是以 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%”),则获得奖励积分。

如果您可以添加一个命令以从每个帧中输出一个 .mp4 文件,该文件可以在 SONY Vegas 等软件程序中进行编辑,则可以获得额外奖励积分。我已经设法从这些照片中使用 mencoder 制作视频文件 (.avi),但生成的视频在我尝试过的任何视频编辑器中都不起作用。

4

3 回答 3

7

有几件事浮现在脑海...

首先,不要为每张图像启动两次 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=Estimated Time of Arrival)parallel,它会告诉您有多少工作以及剩余多少时间。

当你对你有信心时,parallel你可能会像这样运行你的整个过程:

parallel --eta convert {} -resize 1920x1440 -crop 1920x1080+0+32 cropped/{} ::: *.jpg

我创建了 750 张与您的尺寸相同的图像并以这种方式运行它们,我的中等规格 iMac 需要 55 秒来调整和裁剪该批次 - YMMV。请添加评论并说明您的进展情况 - 处理时间有多长parallel

于 2015-03-15T11:37:04.750 回答
2

首先,为了加快速度,不要将内容回显到屏幕上,将其回显到文件中,如果您想知道读取文件的状态(很容易使用 tail 命令完成),这确实会更快。但是,这似乎不是您程序的真正瓶颈。我可以推荐的主要事情是并行运行它,有什么理由不能在 pic #4 之前裁剪+resize 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
于 2015-03-15T09:01:33.057 回答
0

使用

-define jpeg:size=1920x1440

选项连同 -resize。如果您有旧版本的 ImageMagick(对不起,我不知道语法何时更改),请使用

-size 1920x1440

选项连同 -resize。

于 2015-03-17T22:00:48.700 回答