我知道在命令行上调整图像大小是ImageMagick和类似的事情,遗憾的是我只有非常基本的bash脚本功能,所以我想知道这是否可能:
感谢您的任何意见。
答案 0 :(得分:1)
即使对于高级用户来说,实现也不是那么简单。作为单线:
find \ # 1
~/Downloads \ # 2
-type f \ # 3
-exec file \{\} \; \ # 4
| awk -F: '{if ($2 ~/image/) print $1}' \ # 5
| while IFS= read -r file_path; do \ # 6
mogrify -resize 1024x1024\> "$file_path"; \ # 7
done # 8
第1-4行是find
命令的调用:
每个找到的项目运行file
命令。每个文件的示例输出:
/Downloads/391A6 625.png: PNG image data, 1024 x 810, 8-bit/color RGB, interlaced
/Downloads/STRUCTURED NODES IN UML 2.0 ACTIVITES.pdf: PDF document, version 1.4
请注意,文件名如何用:
与信息分隔,有关PNG的信息包含image
字。其他图像格式也是如此。
使用awk
仅过滤信息中带有image
词的那些文件。这仅给我们图像文件。在此,-F:
指定分隔符为:
。这为我们提供了变量$1
来包含原始文件名,变量$2
来包含文件信息。我们在文件信息中搜索image
单词并打印文件名(如果存在)。
awk
的输出,并调用mogrify
命令调整图像大小。这里我们不使用管道和xargs
,就好像文件路径包含空格或其他必须转义的字符一样,
我们将收到xargs unterminated quote
个错误,很难解决。mogrify
命令。与convert
也是ImageMagic的命令不同,mogrify
可以在不创建新文件的情况下就地更改文件。在这里,1024x1024\>
告诉您调整图像大小以使其最大尺寸为1024x1024
。 \>
部分告诉您保留长宽比,以便最终图像的最大边为1024px。除非原始图像是正方形的,否则另一边会小于该边。请注意;
,因为它在循环中是必需的。请注意,在同一文件上运行mogrify
多次是安全的:如果文件的大小已经与您的目标尺寸相对应,则不会再次调整大小。但是,它会更改文件的修改时间。
此外,您可能不仅需要调整图像大小,还需要压缩它们。请参阅我的要旨以了解如何完成此操作:https://gist.github.com/oblalex/79fa3f85f05924017d25004496493adb
如果您的目标只是缩小大尺寸图像,例如大于300K,您可以:
find /path/to/dir -type f -size +300k
mogrify -strip -interlace Plane -format jpg -quality 85 -define jpeg:extent=300KB "$FILE_PATH"
在这种情况下,将为非jpg
的原始文件创建新的jpg
文件,并且需要删除原始文件。请参阅要点,以了解如何完成此操作。
答案 1 :(得分:0)
您可以使用循环遍历目录的bash unix shell脚本来实现。您必须标识所需的所有文件格式,例如jpg和png等。然后,对于每个目录,循环遍历给定格式列表的每个文件。然后使用ImageMagick调整文件大小。
cd
dirlist="path2/directory1 path2/directory2 ...."
for dir in $dirlist; do
cd "$dir"
imglist=`ls | grep -i ".jpg\|.png"`
for img in $imglist; do
convert $img -resize "200x200>" $img
done
done
请参阅https://www.imagemagick.org/script/command-line-processing.php#geometry