Odpowiedzi:
Najlepszym rozwiązaniem byłoby użycie Imagemagick
Nie jestem ekspertem w zakresie rzeczywistego użytkowania, ale wiem, że możesz zrobić prawie wszystko z tym związane!
Przykładem jest:
convert image.png image.jpg
i zachowa oryginał, a także utworzy przekonwertowany obraz. Co do partii. Myślę, że musisz użyć narzędzia Mogrify (z tego samego wiersza poleceń, gdy jest w imagemagick). Pamiętaj, że to zastępuje stare obrazy.
Polecenie to:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.pngjak mam 2 pliki i file img.*zgłasza jeden png, oryginalny nietknięty i nowy jpeg. Tak mogrifynie nie nadpisać oryginalnych plików w tym przypadku.
mogrifydokumentacji: „ To narzędzie jest podobne do converttego, że oryginalny plik obrazu jest zastępowany (chyba że zmienisz sufiks pliku za pomocą opcji -format ) wraz ze wszystkimi
Mam jeszcze kilka rozwiązań.
Najprostsze rozwiązanie jest jak większość już opublikowanych. Prosty bash dla pętli.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
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.
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ń 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).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Domyślnie liczba zadań odpowiada liczbie prowadzonych procesów. Znalazłem lepsze wykorzystanie procesora przy użyciu 3 zadań w moim systemie dwurdzeniowym.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
A jeśli chcesz trochę statystyk (ETA, ukończone zadania, średni czas na zadanie ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Istnieje również alternatywna składnia, jeśli używasz GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
I podobna składnia dla niektórych innych wersji (w tym debian).
parallel convert '{}' '{.}.jpg' -- *.png
donena końcu potrzebujesz pętli. Ponadto, dla równoległych rzeczy, możesz uniknąć używania tego lsi fajki z konstrukcją podobną do: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png(patrz tutaj )
lsmetody 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.
convertKomenda znaleźć na wielu dystrybucjach systemu Linux jest zainstalowany jako część pakietu ImageMagick. Oto kod bash do uruchomienia convertna wszystkich plikach PNG w katalogu i uniknięcia problemu podwójnego rozszerzenia:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Dla tych, którzy chcą tylko najprostszych poleceń:
Konwertuj i zachowuj oryginalne pliki:
mogrify -format jpg *.png
Konwertuj i usuwaj oryginalne pliki:
mogrify -format jpg *.png && rm *.png
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
bar.png
foo.png
foobar.jpg
Przechowuje wszystkie oryginalne pliki png, a także tworzy pliki jpg.
mogrify -format jpg *.png
Wynik
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Wyjaśnienie
-formatopcji. (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))- formatOpcja określa, że będzie zmiana formatu, a następnego Argument musi być typu (w tym przypadku, jpg).*.pngsą pliki wejściowe (wszystkie pliki z rozszerzeniem .png).Konwertuje wszystkie pliki png na jpg, usuwa oryginał.
mogrify -format jpg *.png && rm *.png
Wynik
bar.jpg
foo.jpg
foobar.jpg
Wyjaśnienie
&&to operator logiczny. W skrócie:
0oznacza 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.rmPolecenie usuwa pliki.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:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Konwertuj wszystkie pliki png we wszystkich podkatalogach i podaj dane wyjściowe dla każdego:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Konwertuj wszystkie pliki png we wszystkich podkatalogach, umieść wszystkie wynikowe pliki jpg w allkatalogu, numeruj je, usuwaj oryginalne pliki png i wyświetlaj dane wyjściowe dla każdego pliku, gdy ma to 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
while readczęści (wymień ją lub usuniesz wszystkie razem) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpgpliki wynikowe obok oryginalnych *.pngplikó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
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done. Że unika się całkowicie zbędne ls, grepa sedpołączenia (a echo, 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 wersje lsmożna bezpiecznie analizować.
Wiele lat za późno, istnieje narzędzie png2jpeg specjalnie do tego celu, którego jestem autorem.
Dostosowanie kodu przez @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Do przetwarzania wsadowego:
for img in *.png; do
convert "$img" "$img.jpg"
done
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.
To jest to, czego używam do konwersji, gdy pliki obejmują więcej niż jeden katalog. Mój oryginalny to TGA na PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Chodzi o to, findże potrzebujesz plików, usuń rozszerzenie, a następnie dodaj je ponownie xargs. 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
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg