我为摄影师创建了一个小应用程序,可以在音乐活动期间拍摄实时照片。
图像从尼康相机发送到我的ftp服务器。
应用程序检查(cron)指定文件夹中是否有新图像
然后将它们复制到" develop"文件夹,使用ImageMagick处理它们(调整大小,过滤和水印)
然后将它们移到"发送"文件夹并将其附加到发送给指定收件人的电子邮件中。
问题:我希望能够在处理之前检查图像是否已完全上传。 cron每隔5分钟运行一次,摄影师在音乐会期间连续拍摄。
我一直在这里查看类似的问题,但我并没有真正找到解决方案。所以,如果是一个重复的问题,我为此道歉。
谢谢,s @ ch @ x
更新#1 - 这是我对Mark Setchell的建议所做的测试:
`exec("convert -regard-warnings -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");`
和
`exec("convert -size 1280x44.879451 xc:none -gravity center -pointsize 24 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©M.Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©M.Setchell' roll/SUBSONICA.JPG -regard-warnings +swap -gravity south -geometry +0-3 -composite send/SUBSONICA.JPG && rm roll/SUBSONICA.JPG");`
以下vars来自php:
-size 1280x44.879451
($imageSize = getimagesize($developDir . $developFile);
)
-annotate 0 '©M.Setchell'
($watermark
)
roll/SUBSONICA.JPG
($developDir . $developFile
语句中的输入文件:foreach
)
send/SUBSONICA.JPG
($sendDir . $developFile
语句中的输出文件:foreach
)
通过测试,在通过ftp手动上传图片的过程中,我收到了预期有8个附件的电子邮件,其中4个仍然是部分图像。
UPDATE#2 - 我在exec
函数中添加了一个输出数组和一个var用于执行命令的返回状态 - 就像在@Mark Setchell中一样更新如下。
然后,通过简单的if ... else
语句,我可以轻松地分析结果:
因此,根据@Mark Setchell的回答,正确且完整的exec
字符串是:
`convert -regard-warnings -size 1024x40 xc:none -gravity center -pointsize 20 -font 'Times-Bold' -stroke black -strokewidth 1 -annotate 0 '©2016 Mark Setchell' -background none -shadow 100x3+0+0 +repage -stroke none -fill white -annotate 0 '©2016 Mark Setchell' roll/SUBSONICA_small.jpg +swap -gravity south -geometry +0-3 -composite send/SUBSONICA_small.jpg`
以下是完美运作的代码段:
exec("convert $im_cmd", $convert_output, $returned_var);
if ($returned_var) {
unlink($send_dir . "/" . $developFile);
} else {
unlink($develop_dir . "/" . $developFile);
}
这个解决方案非常有效,经过10次测试证明它非常可靠:不是通过php检查文件,而是最初的问题,@ Mark Setchell的方法 - 使用-regard-warnings
选项Imagemagick转换程序link - 解决了问题。
答案 0 :(得分:0)
更新了答案
好的,我们现在很近!如果要使用PHP而不是命令行,则需要从exec()
获取返回值,并根据该值执行某些操作。因此,如果您选中here,则可以看到如何获取返回值:
exec("convert -regard-warnings inputfile ... resize ... filter ... output/outputfile",array &$output, int &$return_var);
然后,如果$return_var
为零,则需要删除输入文件,因为该命令有效,如果它不为零,则需要删除输出文件,因为它没有。
原始答案
您可以让ImageMagick告诉您文件是否不完整。因此,不是盲目地复制文件,而是从FTP目录中" en masse" ,而是使用Imagemagick convert
从那里处理它们到处理过的目录,只删除成功处理的那些,在下一个cron调用的基础上保留其他任何未完成的处理。所以,像这样:
cd FTPDirectory
for f in *.jpg; do
convert -regard-warnings ... resize ... sharpen ... "%f" processed/"%f"
# If successful, delete source file
if [ $? -eq 0 ]; then
rm "%f"
fi
done
-regard-warnings
标志会将警告视为错误。因此,如果我不使用它,处理不完整的文件时我没有错误状态:
convert incomplete.jpg processed.jpg
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
echo $?
0
然而,如果我使用它,我会收到一个可捕获的错误:
convert -regard-warnings incomplete.jpg processed.jpg
convert: Premature end of JPEG file `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
convert: Corrupt JPEG data: premature end of data segment `incomplete.jpg' @ warning/jpeg.c/JPEGWarningHandler/352.
echo $?
1