2009-11-16 02:06:38 +0000 2009-11-16 02:06:38 +0000
172
172

Пакетная конвертация PNG в JPG в linux

Знает ли кто-нибудь хороший способ пакетной конвертации кучи PNG в JPG в linux? (Я использую Ubuntu).

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

Ответы (10)

247
247
247
2009-11-16 02:15:29 +0000

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

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

Пример:

convert image.png image.jpg

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

Команда:

mogrify -format jpg *.png
83
83
83
2013-01-28 02:45:11 +0000

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

Самое простое решение, как и большинство уже размещено.

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
26
26
26
2009-11-16 03:28:26 +0000

T

11
11
11
2015-10-17 15:02:05 +0000

tl;dr

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

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

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 означает отсутствие ошибок.
  • Так как && выполняет вычисление короткого замыкания , правильная часть будет выполнена только в том случае, если there не было ошибок. Это полезно, так как, возможно, вы не захотите удалять все исходные файлы, если произошла ошибка их преобразования.
  • Команда rm удаляет файлы.

Fancy Stuff

Теперь вот несколько хороших вещей для тех, кому 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
8
8
8
2009-11-16 05:29:10 +0000

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

png2pnm foo.png | cjpeg > foo.jpeg
6
6
6
2014-10-13 17:12:00 +0000
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
5
5
5
2012-05-07 12:42:40 +0000

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

4
4
4
2016-10-22 09:37:31 +0000

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

Адаптация кода по @Marcin:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
3
3
3
2009-11-16 02:28:02 +0000

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

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

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

Это будет работать в bash, и, возможно, bourne. Не знаю насчет других оболочек, но единственное отличие, скорее всего, будет синтаксис цикла.

1
1
1
2016-09-17 02:34:45 +0000

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

Похожие вопросы

6
10
5
37
5