Ubuntu ImageMagik“;转换;函数可以';t一次裁剪300多个文件

Ubuntu ImageMagik“;转换;函数可以';t一次裁剪300多个文件,ubuntu,memory,jpeg,imagemagick-convert,timelapse,Ubuntu,Memory,Jpeg,Imagemagick Convert,Timelapse,我正在创建一个视频时间点。我拍的所有照片都是.jpg图像,宽高比为4:3。2592x1944分辨率。我希望他们在1920x1080的时候是16:9 我写了一个小脚本来做这件事,以及拼凑一个视频,但我遇到了问题 当我的文件少于300个时,这个脚本非常有效,但当我的文件超过300个时,我用来裁剪图像的“convert”命令只会占用所有内存并冻结我的计算机(8GB RAM),所有这些都不会裁剪一张照片 总共有大约300000张照片。。。我计划分批拍摄,每张大约50000张照片。因此,这显然是一个必须克

我正在创建一个视频时间点。我拍的所有照片都是.jpg图像,宽高比为4:3。2592x1944分辨率。我希望他们在1920x1080的时候是16:9

我写了一个小脚本来做这件事,以及拼凑一个视频,但我遇到了问题

当我的文件少于300个时,这个脚本非常有效,但当我的文件超过300个时,我用来裁剪图像的“convert”命令只会占用所有内存并冻结我的计算机(8GB RAM),所有这些都不会裁剪一张照片

总共有大约300000张照片。。。我计划分批拍摄,每张大约50000张照片。因此,这显然是一个必须克服的问题。但目前我正在测试大约700张照片

这是我写的剧本。我正在运行Ubuntu 14.04

请注意,我已经确定问题发生在“convert”函数期间。如果我在脚本的其余部分之外运行它,仍然会发生这种情况

mkdir resized

echo Begin Resizing!
mogrify -path resized -resize 1920x1440! *.JPG #Resizes all files, maintaining 4:3 aspect ratio

echo Resizing Complete! Begin Cropping!
cd resized
convert *.JPG -crop 1920x1080+0+$1 D$2P$3 #Crops all 4:3 files to 16:9 aspect ratio. Takes command line arguments for cropping dimensions and filename (Memory leaks, can't crop ? 300 images!)

echo Cropping Complete!
mkdir cropped
mv D* cropped/ #Moves all cropped photos into new directory
cd cropped
find . -type f -exec mv '{}' '{}'.JPG \; #Adds '.JPG' to each filename
ls *.JPG -1tr > files.txt #Creates List of files

echo MAKING VIDEO!
mencoder -nosound -noskip -oac copy -ovc copy -o output.avi -mf fps=30 'mf://@files.txt' #Creates .avi video from jpg images (very fast)
#avconv -i output.avi -c:v libx264 -preset slow -crf 15 output-final.mkv #Converts .avi to .mkv video (Very Slow - looking for better method than making 2 vids)

echo ---------
echo ALL DONE! 
echo ---------
我对它进行了研究,发现300-350张图像似乎完全冻结了电脑

这个问题是我最大的问题,但还有两个问题有点相关。解决第一个问题可能需要绕过这个问题

  • 目前,我调整每张照片的大小,将其保存为新文件,然后对其进行裁剪,并将其保存为另一个文件。因为我将同时处理大约50000张照片。。。这将变得很麻烦。无论如何,我可以一次裁剪和调整照片的大小?然而,至关重要的是,我必须能够指定裁剪照片的确切位置。我不能从顶部和底部剪下等量的东西

  • 我目前正在把它制作成一个视频,这是我唯一能做的工作——从jpgs制作一个.avi文件,然后再从这个转换成第二个视频。这显然也是一个不必要的步骤,但我不确定如何直接访问.mkv(或者更好的是,a.mp4)。这个问题最终可能会变得毫无意义,因为我正在寻找非终端解决方案,从照片(即索尼维加斯和GoPro Studio)制作实际视频


  • 将*.JPG替换为文件的循环,以便每次转换都会退出。这样你就避免了这个问题

    示例(未测试):


    也许对内存设置一些限制并定义一个临时路径会有所帮助

    我用这种方式拍摄了大约1200张照片,没有任何问题

    convert -monitor -limit memory 2GiB -limit map 4GiB -define registry:temporary-path=/data/tmp *.JPG -crop 1920x1080+0+$1 D$2P$3
    


    无论如何,您都无法一次性处理数万个文件,因为命令行的长度是有限制的。我会将内部循环重写为一次在单个文件上运行,然后确定是否可以批量运行多个实例。然后,也可以在循环中清理临时文件;因此,您将在临时文件上花费更少的硬盘空间。我现在将此作为一个循环:“for f in*.JPG do echo”mog$f“mogrify-path crapped-resize 1920x1440!$f echo“convert$f”convert crapped/$f-crapp 1920x1080+0+$1-set filename:name'%t'crapped/'%[filename:name].JPG“done”这能处理50k文件吗?我现在在700上运行它,内存使用率稳定在55%,CPU使用率保持在85%。这需要一段时间。。。但我认为这是可能的。你键入的内容不起作用,但我设法调整它使之起作用。我有:“对于ls*.JPG中的f”。由于某些原因,使用变量文件导致出现“未找到命令:File1.JPG”错误。而且,一旦我修复了这个问题,它就开始在循环的每次迭代中自动写入每个文件。因此,我通过使用“convert$f-crop1920x1080+0+87-set filename:name'%t'cropped/'%[filename:name].JPG'”修复了这个问题,因此它会写入一个新目录。这也消除了移动文件和重命名它们的需要,就像我一直在做的那样。
    for f in ls*.JPG
    做了完全相同的事情,只是它在循环标记列表的开始添加了一个(可能不存在)文件
    ls
    。不要为此使用
    ls
    命令;但是,我也同意
    FILES
    变量是无用的,并且可能会带来复杂性。
    convert -monitor -limit memory 2GiB -limit map 4GiB -define registry:temporary-path=/data/tmp *.JPG -crop 1920x1080+0+$1 D$2P$3