Czy ktoś zna dobry sposób na grupową konwersję kilku plików PNG na pliki JPG w systemie Linux? (Używam Ubuntu).
Plik binarny png2jpg, który mógłbym po prostu umieścić w skrypcie powłoki, byłby idealny.
linux
shell-script
jpeg
png
Nedned
źródło
źródło
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
jak mam 2 pliki ifile img.*
zgłasza jeden png, oryginalny nietknięty i nowy jpeg. Takmogrify
nie nie nadpisać oryginalnych plików w tym przypadku.mogrify
dokumentacji: „ To narzędzie jest podobne doconvert
tego, że oryginalny plik obrazu jest zastępowany (chyba że zmienisz sufiks pliku za pomocą opcji -format ) wraz ze wszystkimiMam jeszcze kilka rozwiązań.
Najprostsze rozwiązanie jest jak większość już opublikowanych. Prosty bash dla pętli.
Z jakiegoś powodu staram się unikać pętli w bashu, więc tutaj jest bardziej unikalne podejście xargs, używając bash do manglingu nazw.
Ten, którego używam. Używa GNU Parallel do uruchamiania wielu zadań jednocześnie, co zapewnia wzrost wydajności. Jest instalowany domyślnie na wielu systemach i prawie na pewno znajduje się w twoim repozytorium (jest to dobry program do obejrzenia).
Domyślnie liczba zadań odpowiada liczbie prowadzonych procesów. Znalazłem lepsze wykorzystanie procesora przy użyciu 3 zadań w moim systemie dwurdzeniowym.
A jeśli chcesz trochę statystyk (ETA, ukończone zadania, średni czas na zadanie ...)
Istnieje również alternatywna składnia, jeśli używasz GNU Parallel.
I podobna składnia dla niektórych innych wersji (w tym debian).
źródło
done
na końcu potrzebujesz pętli. Ponadto, dla równoległych rzeczy, możesz uniknąć używania tegols
i fajki z konstrukcją podobną do:parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(patrz tutaj )ls
metody dla siebie, ponieważ ma to dla mnie większy sens.--
raczej użyj niż:::
) - a nawet wtedy frustrująco brakuje niektórych funkcji GNU równoległych.convert
Komenda znaleźć na wielu dystrybucjach systemu Linux jest zainstalowany jako część pakietu ImageMagick. Oto kod bash do uruchomieniaconvert
na wszystkich plikach PNG w katalogu i uniknięcia problemu podwójnego rozszerzenia:źródło
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
tl; dr
Dla tych, którzy chcą tylko najprostszych poleceń:
Konwertuj i zachowuj oryginalne pliki:
Konwertuj i usuwaj oryginalne pliki:
Wyjaśnienie przetwarzania wsadowego
Trochę późno na imprezę, ale aby wyjaśnić zamieszanie komuś, kto może nie czuć się komfortowo z cli, oto super głupie odniesienie i wyjaśnienie.
Przykładowy katalog
Prosta konwersja
Przechowuje wszystkie oryginalne pliki png, a także tworzy pliki jpg.
Wynik
Wyjaśnienie
-format
opcji. (Z witryny :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
Opcja określa, że będzie zmiana formatu, a następnego Argument musi być typu (w tym przypadku, jpg).*.png
są pliki wejściowe (wszystkie pliki z rozszerzeniem .png).Konwertuj i usuwaj
Konwertuje wszystkie pliki png na jpg, usuwa oryginał.
Wynik
Wyjaśnienie
&&
to operator logiczny. W skrócie:0
oznacza brak błędów.&&
wykonuje ocenę zwarcia , odpowiednia część zostanie wykonana tylko wtedy, gdy nie wystąpią błędy . Jest to przydatne, ponieważ możesz nie chcieć usunąć wszystkich oryginalnych plików, jeśli wystąpił błąd podczas ich konwersji.rm
Polecenie usuwa pliki.Fantazyjne rzeczy
Oto kilka korzyści dla osób, które czują się komfortowo z cli.
Jeśli chcesz uzyskać dane wyjściowe podczas konwersji plików:
Konwertuj wszystkie pliki png we wszystkich podkatalogach i podaj dane wyjściowe dla każdego:
Konwertuj wszystkie pliki png we wszystkich podkatalogach, umieść wszystkie wynikowe pliki jpg w
all
katalogu, numeruj je, usuwaj oryginalne pliki png i wyświetlaj dane wyjściowe dla każdego pliku, gdy ma to miejsce:źródło
while read
części (wymień ją lub usuniesz wszystkie razem) ...Rzeczywiste
png2jpg
polecenie, którego szukasz, jest w rzeczywistości podzielone na dwa polecenia o nazwiepngtopnm
icjpeg
, i są one odpowiednio częścią pakietównetpbm
ilibjpeg-progs
.źródło
źródło
*.jpg
pliki wynikowe obok oryginalnych*.png
plików, pokazuje, jak zmniejszyć rozmiar / jakość pliku i nie pęka z powodu nieparzystych znaków w nazwie katalogu lub pliku.moje szybkie rozwiązanie
for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done
źródło
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Że unika się całkowicie zbędnels
,grep
ased
połączenia (aecho
, ale IIRC to jest wbudowane bash i tak nie będzie miał / bardzo mały wpływ na wydajność) i pozbywa się z dwóch rur i dwóch podpowłok, a wiąże się z mniej pisać. Jest nawet nieco bardziej przenośny, ponieważ nie wszystkie wersjels
można bezpiecznie analizować.Wiele lat za późno, istnieje narzędzie png2jpeg specjalnie do tego celu, którego jestem autorem.
Dostosowanie kodu przez @Marcin:
źródło
Do przetwarzania wsadowego:
Skończysz z nazwami plików, takimi jak image1.png.jpg.
Będzie to działać w trybie bash, a może bourne. Nie wiem o innych powłokach, ale jedyną różnicą byłaby prawdopodobnie składnia pętli.
źródło
To jest to, czego używam do konwersji, gdy pliki obejmują więcej niż jeden katalog. Mój oryginalny to TGA na PNG
Chodzi o to,
find
że potrzebujesz plików, usuń rozszerzenie, a następnie dodaj je ponowniexargs
. W przypadku PNG na JPG zmieniłbyś rozszerzenia i zrobiłeś jedną dodatkową rzecz, aby poradzić sobie z kanałami alfa, mianowicie ustawiając tło (w tym przykładzie białe, ale możesz je zmienić), a następnie spłaszczyć obrazźródło