146

Кто-нибудь знает хороший способ пакетного преобразования группы PNG в JPG в Linux? (Я использую Ubuntu).

Двоичный файл png2jpg, который я мог бы просто вставить в сценарий оболочки, был бы идеальным.

10 ответов10

220

Лучше всего было бы использовать Imagemagick

Я не эксперт по фактическому использованию, но я знаю, что вы можете в значительной степени сделать что-нибудь изображение, связанное с этим!

Примером является:

convert image.png image.jpg

и он сохранит оригинал, а также создаст преобразованное изображение. Что касается партии. Я думаю, что вам нужно использовать инструмент Mogrify (из той же командной строки, когда в ImageMagick). Имейте в виду, что это перезаписывает старые изображения.

Команда:

mogrify -format jpg *.png  
73

У меня есть еще пара решений.

Самое простое решение похоже на большинство уже опубликованных. Простой удар для цикла.

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
25

Команда convert присутствующая во многих дистрибутивах Linux, устанавливается как часть пакета ImageMagick. Вот код bash для запуска convert всех файлов PNG в каталоге и избежания этой проблемы с двойным расширением:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
7

ТЛ; др

Для тех, кто просто хочет самые простые команды:

Конвертируйте и сохраняйте оригинальные файлы:

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

объяснение

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

объяснение

  • Первая часть точно такая же, как и выше, она создаст новые файлы 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
7

Фактическая команда " png2jpg ", которую вы ищете, в действительности разделена на две команды, называемые pngtopnm и cjpeg , и они являются частью пакетов netpbm и libjpeg-progs , соответственно.

png2pnm foo.png | cjpeg > foo.jpeg
4
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
3

мое быстрое решение for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done

2

Слишком много лет спустя, специально для этой цели есть утилита png2jpeg , которую я создал.

Адаптация кода с помощью @Marcin:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
2

Для пакетной обработки:

for img in *.png; do
  convert "$img" "$img.jpg"
done

Вы получите имена файлов вроде image1.png.jpg.

Это будет работать в Bash, и, возможно, Bourne. Я не знаю о других оболочках, но единственное различие, вероятно, будет синтаксис цикла.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .