Відповіді:
Найкращим варіантом буде використання Imagemagick
Я не фахівець з фактичного використання, але я знаю, що ти можеш зробити майже все, що стосується цього!
Приклад:
convert image.png image.jpg
і він збереже оригінал, а також створить перетворене зображення. Що стосується партії. Я думаю, вам потрібно скористатися інструментом Mogrify (з того самого командного рядка, коли і в imagemagick). Майте на увазі, що це перезаписує старі зображення.
Команда така:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
мене є два файли та file img.*
звіти про один png, оригінальний недоторканий та новий jpeg. Так mogrify
само НЕ перезаписує вихідні файли в цьому випадку.
mogrify
документації: " Цей інструмент схожий, за convert
винятком того, що оригінальний файл зображення буде перезаписаний (якщо ви не змінюєте суфікс файлу за допомогою параметра -формат ) з будь-якими
У мене є ще пара рішень.
Найпростіше рішення, як і більшість вже опублікованих. Простий баш для петлі.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Чомусь я схиляюсь уникати циклів у bash, тому тут є більш уніфікований підхід xargs, використовуючи bash для імені mangling.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Той, який я використовую. Він використовує GNU Parallel для запуску декількох завдань одночасно, що підвищує продуктивність. Він встановлений за замовчуванням у багатьох системах і майже напевно є у вашому репо (це гарна програма, щоб мати навколо).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Кількість завдань за замовчуванням відповідає кількості процесів. Я знайшов краще використання CPU, використовуючи 3 завдання в моїй двоядерній системі.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
І якщо ви хочете отримати деякі статистичні дані (ЗНО, завершені робочі місця, середній час на роботу ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Існує також альтернативний синтаксис, якщо ви використовуєте GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
І подібний синтаксис для деяких інших версій (включаючи debian).
parallel convert '{}' '{.}.jpg' -- *.png
done
кінець для циклу. Крім того, для паралельних речей ви можете уникнути використання цього ls
і труби з такою конструкцією, як: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(див. Тут )
ls
методу для себе, тому що це має більше сенсу для мене.
--
а не :::
), - і навіть тоді йому неприємно не вистачає деяких особливостей паралелі GNU.
convert
Команда на багатьох дистрибутивах Linux встановлюється як частина пакету ImageMagick. Ось базовий код для запуску convert
всіх файлів PNG у каталозі та уникнення проблеми подвійного розширення:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/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
while read
частини (замініть або видаліть її всі разом) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
файли поруч з оригінальними *.png
файлами, показує, як зменшити розмір / якість файлу і не зламатися через відсутність непарних символів у каталозі чи імені файлу.
моє швидке рішення
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Це дозволяє уникнути абсолютно непотрібних ls
, grep
і sed
дзвінків (і echo
, але IIRC, це вбудований баш і тому не матиме / дуже малого впливу на продуктивність), і позбавляється від двох труб і двох підпакетів і передбачає менший набір тексту. Це навіть трохи портативніше, оскільки не всі версії системи ls
є безпечними для розбору.
Багато років пізно, є спеціально для цієї мети утиліта 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.
Це буде спрацьовувати в баші, а може, і поквапитися. Я не знаю про інші оболонки, але єдиною різницею, ймовірно, буде синтаксис циклу.
Це те, що я використовую для перетворення, коли файли охоплюють більше ніж один каталог. Моїм оригінальним був 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