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

Seryjna konwersja PNG na JPG w linuksie

Czy ktoś zna dobry sposób na seryjną konwersję wiązki PNG na JPG w linuksie? (używam Ubuntu).

Binarne png2jpg, które mógłbym po prostu wrzucić do skryptu powłoki byłoby idealne.

Odpowiedzi (10)

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

Najlepiej byłoby użyć Imagemagick

Nie jestem ekspertem w rzeczywistym użyciu, ale wiem, że możesz zrobić wszystko, co jest z tym związane!

Przykładem jest:

convert image.png image.jpg

i zachowa oryginał, jak również tworzenie przekształconego obrazu. Co do partii. Myślę, że trzeba użyć narzędzia Mogrify (z tej samej linii poleceń, gdy w imagemagick). Pamiętaj, że to nadpisuje stare obrazy.

Polecenie jest:

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

Mam jeszcze kilka innych rozwiązań.

Najprostsze rozwiązanie jest jak większość już zamieszczonych. Prosty bash dla pętli.

for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done

Z jakiegoś powodu mam tendencję do unikania pętli w bashu, więc tutaj jest bardziej unixy xargs podejście, używając basha do mieszania nazw.

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'

Ten, którego używam. Używa GNU Parallel do uruchamiania wielu zadań na raz, co daje wzrost wydajności. Jest on domyślnie zainstalowany na wielu systemach i jest prawie na pewno w twoim repo (jest to dobry program, który można mieć w pobliżu).

ls -1 *.png | parallel convert '{}' '{.}.jpg'

Liczba zadań domyślnie odpowiada liczbie procesów, które masz. Znalazłem lepsze wykorzystanie procesora przy użyciu 3 zadań w moim dwurdzeniowym systemie.

ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'

A jeśli chcesz mieć jakieś statystyki (ETA, ukończone zadania, średni czas na zadanie…)

ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'

Jeśli używasz GNU Parallel, istnieje również alternatywna składnia.

parallel convert '{}' '{.}.jpg' ::: *.png

I podobna składnia dla niektórych innych wersji (włączając debiana).

parallel convert '{}' '{.}.jpg' -- *.png
26
26
26
2009-11-16 03:28:26 +0000

Polecenie convert znalezione na wielu dystrybucjach Linuksa jest zainstalowane jako część pakietu ImageMagick. Oto kod bash do uruchomienia convert na wszystkich plikach PNG w katalogu i uniknięcia tego problemu z podwójnym rozszerzeniem:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done
11
11
11
2015-10-17 15:02:05 +0000

tl;dr

Dla tych, którzy chcą tylko najprostszych komend:

Odwróć i utrzymaj oryginalne pliki:

mogrify -format jpg *.png

Odwróć i usuń oryginalne pliki:

mogrify -format jpg *.png && rm *.png

Batch Converting Explained

Trochę późno na imprezę, ale tylko po to, aby wyczyścić całe zamieszanie dla kogoś, kto może nie być bardzo wygodny z klipu, oto super głupie odniesienie i wyjaśnienie.

Przykładowy katalog

bar.png
foo.png
foobar.jpg

Prosta konwersja

Zachowuje wszystkie oryginalne pliki png, jak również tworzy pliki jpg.

mogrify -format jpg *.png

Wynik

bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg

Wyjaśnienie

  • mogrify jest częścią pakietu ImageMagick narzędzi do przetwarzania obrazów.
  • mogrify przetwarza obrazy w miejscu, co oznacza, że oryginalny plik jest nadpisywany, z wyjątkiem opcji -format. (Od miejsce : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option))
  • opcja - format określa, że będziesz zmieniał format, a następnym argumentem musi być typ (w tym przypadku jpg).
  • Na koniec, *.png jest plikiem wejściowym (wszystkie pliki zakończone .png).

Convert and Remove

Converts all png files to jpg, removes original.

mogrify -format jpg *.png && rm *.png

Result

bar.jpg
foo.jpg
foobar.jpg

Explanation

  • Pierwsza część jest dokładnie taka sama jak powyżej, utworzy nowe pliki jpg.
  • && jest operatorem boolean. W skrócie:
  • Kiedy program kończy pracę, zwraca status zakończenia. Status 0 oznacza brak błędów.
  • Ponieważ && wykonuje ocena zwarć , właściwa część zostanie wykonana tylko wtedy, gdy nie było żadnych błędów. Jest to użyteczne, ponieważ możesz nie chcieć usuwać wszystkich oryginalnych plików, jeśli wystąpił błąd podczas ich konwersji.
  • Komenda rm usuwa pliki.

Fancy Stuff

Oto kilka gadżety dla ludzi, którzy are wygodnie z klikiem.

Jeśli chcesz jakieś wyjście podczas konwertowania plików:

for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done

Przekonwertuj wszystkie pliki png we wszystkich podkatalogach i daj wyjście dla każdego z nich:

find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done

Przekonwertuj wszystkie pliki png we wszystkich podkatalogach, umieść wszystkie wynikowe jpgs w katalogu all, ponumeruj je, usuń oryginalne pliki png i wyświetl wyjście dla każdego pliku, jak to ma miejsce:

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

Właściwa komenda “png2jpg”, której szukasz, jest w rzeczywistości podzielona na dwie komendy zwane pngtopnm i cjpeg, i są one częścią pakietów netpbm i libjpeg-progs, odpowiednio.

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

moje szybkie rozwiązaniefor 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

Wiele lat za późno, jest narzędzie png2jpeg specjalnie do tego celu, które napisałem.

Adaptacja kodu przez @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

Dla przetwarzania wsadowego:

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

Skończysz jednak z nazwami plików jak image1.png.jpg.

To będzie działać w bash, a może bourne. Nie znam się na innych powłokach, ale jedyna różnica to prawdopodobnie składnia pętli.

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

To jest to, czego używam do konwersji, gdy pliki obejmują więcej niż jeden katalog. Mój oryginalny był TGA do PNG

find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png

Koncepcja jest find pliki, których potrzebujesz, usunąć rozszerzenie, a następnie dodać go z powrotem z xargs. Więc dla PNG do JPG, można zmienić rozszerzenia i zrobić jedną dodatkową rzecz do czynienia z kanałów alfa, a mianowicie ustawienie tła (w tym przykładzie biały, ale można go zmienić), a następnie spłaszczyć obraz

find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg