Пакетная конвертация PNG в JPG в linux
Знает ли кто-нибудь хороший способ пакетной конвертации кучи PNG в JPG в linux? (Я использую Ubuntu).
Двоичный файл png2jpg, который я могу просто бросить в скрипт оболочки было бы идеально.
Знает ли кто-нибудь хороший способ пакетной конвертации кучи PNG в JPG в linux? (Я использую Ubuntu).
Двоичный файл png2jpg, который я могу просто бросить в скрипт оболочки было бы идеально.
Лучше всего использовать Imagemagick
Я не эксперт в реальном использовании, но я знаю, что вы можете делать все, что связано с этим!
Пример:
convert image.png image.jpg
и он сохранит оригинал, а также создаст преобразованную картинку. Что касается партии. Думаю, вам нужно использовать инструмент Mogrify (из той же командной строки, что и в imagemagick). Имейте в виду, что это переписывает старые образы.
Команда:
mogrify -format jpg *.png
У меня есть еще пара решений.
Самое простое решение, как и большинство уже размещено.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
По каким-то причинам я стараюсь избегать циклов bash, так что вот более unixy 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
Для тех, кто просто хочет простейшие команды:
Конвертировать и сохранить оригинальные файлы:
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). mogrify -format jpg *.png && rm *.png
Результат
bar.jpg
foo.jpg
foobar.jpg
Пояснения
&&
- это булевый оператор. Короче говоря: 0
означает отсутствие ошибок. &&
выполняет вычисление короткого замыкания , правильная часть будет выполнена только в том случае, если there не было ошибок. Это полезно, так как, возможно, вы не захотите удалять все исходные файлы, если произошла ошибка их преобразования. rm
удаляет файлы. Теперь вот несколько хороших вещей для тех, кому are удобно с клиентом.
Если вам нужен вывод при конвертировании:
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 файлы во всех подкаталогах, помещать все получившиеся jpg-файлы в каталог 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
Слишком поздно, много лет назад, появилась утилита png2jpeg специально для этой цели, которую я написал.
Адаптация кода по @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Для пакетной обработки:
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
```.