【问题标题】:ImageMagik "convert" function can't crop more than 300 files at onceImageMagick“转换”功能一次不能裁剪超过 300 个文件
【发布时间】:2015-03-15 04:36:10
【问题描述】:

我正在制作视频延时摄影。我拍摄的所有照片都是以 4:3 纵横比拍摄的 .jpg 图像。 2592x1944 分辨率。我希望它们在 1920x1080 时为 16:9。

我为此编写了一个小脚本,并拼凑了一个视频,但我遇到了问题!

当我的文件少于 300 个时,此脚本效果很好,但当我有更多文件时,我用来裁剪图像的“转换”命令只会占用所有内存并冻结我的计算机(使用 8GB RAM),无需裁剪一张照片!

总共有大约 300,000 张照片……我计划分批制作,每批大约 50,000 张照片。所以这显然是一个必须克服的问题。但目前我正在测试大约 700 张照片。

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

请注意,我已确定问题是在“转换”功能期间发生的。如果我在脚本的其余部分之外运行它,它仍然会发生。

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 张图像似乎是它完全冻结计算机的地方。

这个问题是我最大的问题 - 但还有两个问题有些相关。解决第一个问题可能涉及绕过这个问题。

  1. 我目前正在调整每张照片的大小,将其另存为新文件,然后对其进行裁剪,将其另存为另一个文件。因为我要一次处理约 50,000 张照片……这会变得很麻烦。无论如何,我可以一次裁剪和调整照片大小?但是,至关重要的是,我能够指定裁剪照片的确切位置。我不能只从顶部和底部裁剪等量。

  2. 我目前正在将其制作成视频,这是我可以开始工作的唯一过程 - 从 jpg 制作一个 .avi 文件,然后制作从该文件转换而来的第二个视频。这也是一个明显不必要的步骤,但我不确定如何直接访问 .mkv(或者更好的 .mp4)。这个问题最终可能没有实际意义,因为我正在研究非终端解决方案以从照片中制作实际视频(即 Sony Vegas 和 GoPro Studio)。

【问题讨论】:

  • 无论如何,您将无法一次处理数万个文件,因为命令行的长度是有限制的。我会重写内部循环以一次在单个文件上运行,然后确定是否可以批量运行多个实例。然后也可以在循环内清理临时文件;所以你最终会在临时文件上花费更少的硬盘空间。
  • 我现在有这个循环:"for f in *.JPG do echo "mog $f" mogrify -path cropped -resize 1920x1440!$f echo "convert $f" convert cropped/$ f -crop 1920x1080+0+$1 -set filename:name '%t'cropped/'%[filename:name].JPG' done " 这能处理 50k 个文件吗?我现在在 700 上运行它,内存使用率稳定在 55%,CPU 保持在 85%。这需要一段时间......但我认为可能。

标签: ubuntu memory jpeg imagemagick-convert timelapse


【解决方案1】:

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

示例(未经测试):

#!/bin/bash
FILES=/path/to/*.JPG
for f in $FILES
do
    convert $f -crop 1920x1080+0+$1 D$2P$3
done

【讨论】:

  • 好的。您输入的内容无效,但我设法对其进行了调整以使其正常工作。我有:“for f in ls *.JPG”。由于某种原因,使用变量 FILES 导致出现“找不到命令:File1.JPG”错误。另外-一旦我解决了这个问题,它就会开始在循环的每次迭代中自动覆盖每个文件。所以我通过使用“convert $f -crop 1920x1080+0+87 -set filename:name '%t'cropped/'%[filename:name].JPG'”修复了这个问题,所以它写入了一个新目录。这也消除了移动文件和重命名它们的需要,就像我一直在做的那样。
  • for f in ls *.JPG 做了同样的事情,除了它在要循环的标记列表的开头添加了一个(可能不存在的)文件ls。不要为此使用ls 命令;这是浪费和sometimes even wrong
  • 但是,我也同意 FILES 变量是无用的,并且可能是一个并发症。
【解决方案2】:

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

我用这种方法做了大约 1200 张图像,没有任何问题。

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

http://www.imagemagick.org/script/command-line-options.php#limit

http://www.imagemagick.org/script/command-line-options.php#define

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 2018-01-08
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多