Imagemagick Batch操作以Filesize为条件 - 如何?

时间:2018-06-11 17:49:35

标签: bash imagemagick mogrify

我在Windows 10中的命令行Ubuntu终端上运行Imagemagick - 使用Windows 10中的内置工具 - Ubuntu App。

我是一个完整的Linux新手但在上述环境中安装了imagemagick

我的任务 - 自动移除黑色(ish)边框,并对数千张扫描的35毫米幻灯片的图像进行校正。

我可以成功运行

等命令
mogrify -fuzz 35% -deskew 80% -trim +repage *.tif

问题是: -

  • 边界不清晰,也不是完全黑色,因此是 - fuzz。某些图像在某种模糊处理时被过度修剪,而其他图像则没有足够的修剪。

所以我想要做的就是两次通过,不同的模糊%,原因如下: -

  • 第一遍低Fuzz%。许多图像根本不会被修剪,但我发现那些容易受到过度修剪的图像会以低%修剪好
  • 由于所有图像都以相同的文件大小开头,因此修剪好的文件大小会有较低的文件大小(注意这些是tifs而不是jpgs)
  • 所以我需要做的是设置第二遍的文件大小条件,以更高的模糊%THAT IGNORES文件大小低于某个值,并且不执行任何操作。

这样,错误很少,所有图像都会被正确修剪。

所以问题   - 如何调整命令行以进行2次传递,并在第二次传递时忽略较小的文件大小?

我有一种可怕的感觉,答案将是一个剧本。我不知道如何构建或设置Ubuntu来运行它,所以如果是这样的话,请你指点我也帮助!!

1 个答案:

答案 0 :(得分:1)

在ImageMagick中,您可以执行以下操作:

获取输入文件大小

Use convert to deskew and trim. 

Then find the new file 

Then compare the new to the old to compute the percentdifference to some percent threshold

If the percent difference is less than some threshold, then the processing did not trim enough 

So reprocess with a higher fuzz value and write over the input; otherwise keep the first one only and do not write over the old one.


Unix语法。

选择两个模糊值

选择百分比变化阈值

创建一个新的空目录来保存输出(结果)

cd
cd desktop/Originals
fuzz1=20
fuzz2=40
threshpct=10
list=`ls`
for img in $list; do
filesize=`convert -ping $img -precision 16 -format "%b" info: | sed 's/[B]*$//'`
echo "filesize=$filesize"
convert $img -background black -deskew 40% -fuzz $fuzz1% ../results/$img
newfilesize=`convert -ping ../results/$img -precision 16 -format "%b" info: | sed 's/[B]*$//'`
test=`convert xc: -format "%[fx:100*($filesize-$newfilesize)/$filesize<$threshpct?1:0]" info:`
echo "newfilesize=$newfilesize; test=$test;"
[ $test -eq 1 ] && convert $img -background black -deskew 40% -fuzz $fuzz2% ../results/$img
done


问题是你需要确保为输出设置输出的TIFF压缩与输入相同,这样文件大小是相同的,并且可能是新的大小不比JPG那样大。

请注意,sed用于从文件大小中删除字母B(字节),因此可以将它们作为数字而不是字符串进行比较。 -precision 16强制“%b”报告为B而不是KB或MB。