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.
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.
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
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
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
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
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
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
-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)
) - format
określa, że będziesz zmieniał format, a następnym argumentem musi być typ (w tym przypadku jpg). *.png
jest plikiem wejściowym (wszystkie pliki zakończone .png). Converts all png files to jpg, removes original.
mogrify -format jpg *.png && rm *.png
Result
bar.jpg
foo.jpg
foobar.jpg
Explanation
&&
jest operatorem boolean. W skrócie: 0
oznacza brak błędów. &&
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. rm
usuwa pliki. 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
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
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.
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