Ответы:
Лучше всего будет использовать Imagemagick
Я не эксперт по фактическому использованию, но я знаю, что вы можете в значительной степени сделать что-нибудь изображение, связанное с этим!
Примером является:
convert image.png image.jpg
и он сохранит оригинал, а также создаст преобразованное изображение. Что касается партии. Я думаю, что вам нужно использовать инструмент Mogrify (из той же командной строки, когда в imagemagick). Имейте в виду, что это перезаписывает старые изображения.
Команда:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
меня есть 2 файла и file img.*
сообщается один png, оригинальный нетронутый и новый jpeg. Так mogrify
что не перезаписывать оригинальные файлы в этом случае.
mogrify
документации: « Этот инструмент похож на за convert
исключением того, что исходный файл изображения будет перезаписан (если вы не измените суффикс файла с -format опция) с любыми изменениями вы запрашиваете. »
У меня есть еще пара решений.
Самое простое решение похоже на большинство уже опубликованных. Простой удар для цикла.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
По какой-то причине я стараюсь избегать циклов в bash, так что здесь есть более юниксный подход xargs, использующий bash для искажения имен.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Тот, который я использую. Он использует GNU Parallel для одновременного запуска нескольких заданий, что повышает производительность. Он устанавливается по умолчанию во многих системах и почти наверняка находится в вашем репозитории (это хорошая программа, чтобы иметь вокруг).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Количество заданий по умолчанию равно числу процессов, которые у вас есть. Я нашел лучшее использование процессора, используя 3 задания в моей двухъядерной системе.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
И если вам нужна статистика (ETA, выполненные задания, среднее время работы ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Существует также альтернативный синтаксис, если вы используете GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
И похожий синтаксис для некоторых других версий (включая Debian).
parallel convert '{}' '{.}.jpg' -- *.png
done
конец цикла for. Кроме того, для параллельной работы вы можете избежать использования этого ls
и pipe с такой конструкцией, как: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(см. Здесь )
ls
метода для себя, потому что он имеет больше смысла для меня.
--
а не :::
) - и даже тогда, к сожалению, ей не хватает некоторых функций параллели GNU.
Команда, convert
найденная во многих дистрибутивах Linux, устанавливается как часть пакета ImageMagick. Вот код bash для запуска convert
всех файлов PNG в каталоге и избежания этой проблемы двойного расширения:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Для тех, кто просто хочет самые простые команды:
Конвертируйте и сохраняйте оригинальные файлы:
mogrify -format jpg *.png
Конвертировать и удалить оригинальные файлы:
mogrify -format jpg *.png && rm *.png
Вроде бы поздно на вечеринку, но просто чтобы прояснить всю путаницу для кого-то, кому может быть не очень комфортно с кли, вот супер тупая ссылка и объяснение.
Пример каталога
bar.png
foo.png
foobar.jpg
Сохраняет все оригинальные файлы PNG, а также создает файлы JPG.
mogrify -format jpg *.png
Результат
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
объяснение
-format
опции. (С сайта : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option)
)- format
Параметр указывает , что будет изменение формата, и следующий аргумент должен быть типа (в данном случае, JPG).*.png
это входные файлы (все файлы, заканчивающиеся на .png).Конвертирует все png файлы в jpg, удаляет оригинал.
mogrify -format jpg *.png && rm *.png
Результат
bar.jpg
foo.jpg
foobar.jpg
объяснение
&&
логический оператор. Короче говоря:
0
означает отсутствие ошибок.&&
выполняется оценка короткого замыкания , правая часть будет выполняться только в случае отсутствия ошибок . Это полезно, потому что вы можете не захотеть удалять все исходные файлы, если произошла ошибка при их преобразовании.rm
удаляет файлы.Теперь вот некоторые лакомства для людей , которые являются удобными с кли.
Если вы хотите выводить данные во время конвертации файлов:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Конвертируйте все файлы png во все подкаталоги и дайте вывод для каждого:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Конвертируйте все файлы png во всех подкаталогах, поместите все получившиеся файлы jpgs в all
каталог, пронумеруйте их, удалите исходные файлы png и отобразите выходные данные для каждого файла в том виде, как это происходит:
n=0; find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; fn="all/$((n++)).jpg"; mv "${i%.*}.jpg" "$fn"; echo "Moved $i to $fn"; done
while read
части (замените или удалите все вместе) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
файлы рядом с исходными *.png
файлами, показывает, как уменьшить размер / качество файла и не ломается из-за каких-либо нечетных символов в каталоге или имени файла.
мое быстрое решение
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Это позволяет избежать ненужных полностью ls
, grep
и sed
звонков (и echo
, но IIRC это Баш и поэтому встроенный будет нет / очень мало влияет на производительность), и избавляется от двух труб и два подоболочек, и требует меньше печатать. Это даже немного более портативно, так как не все версии ls
безопасны для анализа.
Для пакетной обработки:
for img in *.png; do
convert "$img" "$img.jpg"
done
Вы получите имена файлов вроде image1.png.jpg.
Это будет работать в Bash, и, возможно, Bourne. Я не знаю о других оболочках, но единственное различие, вероятно, будет синтаксис цикла.
Это то, что я использую для преобразования, когда файлы охватывают более одного каталога. Мой оригинальный был TGA в PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Идея в том, что find
вам нужны файлы, удалите расширение и добавьте его обратно xargs
. Таким образом, для PNG на JPG вы должны изменить расширения и сделать еще одну дополнительную вещь для работы с альфа-каналами, а именно установить фон (в этом примере белый, но вы можете изменить его), а затем сгладить изображение
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg