it-swarm-ru.tech

Пакетное преобразование PNG в JPG в Linux

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

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

151
nedned

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

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

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

convert image.png image.jpg

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

Команда:

mogrify -format jpg *.png  
226
William Hilsum

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

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

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
76
Kevin Cox

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

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

тЛ; др

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

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

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
8
Steven Jeffries

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

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

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

3
max

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

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

#!/bin/sh

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

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

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

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

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

2
Jeffrey Aylesworth

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