Как я могу конвертировать все изображения в каталоге в JPG?
У меня так много разных изображений в каталоге с последовательными именами 1 2 3 4 ... Мне было интересно, если бы можно было преобразовать их все в jpg и измените их размеры до 900x900 без сохранения соотношения сторон.
То, что я попробовал для первой части:
$ mogrify -format jpg -- *
Но когда я делаю это, использование памяти увеличивается так быстро, а затем процесс убивается.Я попытался изменить размер:
$ mogrify -resize 900x900 -- *
mogrify: insufficient image data in file `109.jpg' @ error/jpeg.c/ReadJPEGImage/1039.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
mogrify: no decode delegate for this image format `' @ error/constitute.c/ReadImage/501.
Как я уже сказал, имена файлов являются последовательными номерами. У меня также есть следующее:
$ file * | grep -Po "^\d*: *\K[^:,]*(?=,)" | sort | uniq
ASCII text
GIF image data
JPEG image data
PNG image data
Так в чем проблема? Как я могу это исправить?
1 ответ
Я бы порекомендовал использовать convert инструмент от ImageMagick:
convert input.png -resize 900x900 output.jpg
-resize Опция должна быть довольно очевидной, и формат выходного файла автоматически определяется с использованием расширения его имени.
Чтобы запустить это для всех файлов в текущем каталоге, попробуйте это:
for inputfile in ./* ; do
outputfile="${inputfile%.*}.jpg"
convert "$inputfile" -resize 900x900 "$outputfile" &&
[[ -e "$outputfile" && "$inputfile" != "$outputfile" ]] && rm "$inputfile"
done
Это возьмет все файлы из текущего каталога (независимо от типа файла), и для каждого входного файла создайте соответствующее имя выходного файла, удалив старое расширение и добавив вместо него ".jpg". Тогда он использует convert как описано выше, чтобы изменить размер и преобразовать изображение, которое создает новый файл и оставляет оригинал без изменений. Если это было успешно (&&), проверьте, существует ли выходной файл и отличается ли имя входного файла от имени выходного файла (например, если один из исходных файлов уже был jpg). Теперь, если эти условия соблюдены, мы предполагаем, что можем удалить входной файл.