Кто-нибудь знает хороший способ пакетного преобразования группы 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, так что здесь есть более юниксный подход 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
Команда convert
присутствующая во многих дистрибутивах Linux, устанавливается как часть пакета ImageMagick. Вот код bash для запуска convert
всех файлов PNG в каталоге и избежания этой проблемы с двойным расширением:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.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
Фактическая команда " png2jpg
", которую вы ищете, в действительности разделена на две команды, называемые pngtopnm
и cjpeg
, и они являются частью пакетов netpbm
и libjpeg-progs
, соответственно.
png2pnm foo.png | cjpeg > foo.jpeg
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
мое быстрое решение for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); 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