Как я могу конвертировать все изображения в каталоге в 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). Теперь, если эти условия соблюдены, мы предполагаем, что можем удалить входной файл.

Другие вопросы по тегам