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.png
jak mam 2 pliki i file img.*
zgłasza jeden png, oryginalny nietknięty i nowy jpeg. Tak mogrify
nie nie nadpisać oryginalnych plików w tym przypadku.
mogrify
dokumentacji: „ To narzędzie jest podobne do convert
tego, ż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
done
na końcu potrzebujesz pętli. Ponadto, dla równoległych rzeczy, możesz uniknąć używania tego ls
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 uruchomienia convert
na 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
-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).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:
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.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 all
katalogu, 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 read
części (wymień ją lub usuniesz wszystkie razem) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.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
for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done
. Że unika się całkowicie zbędne ls
, grep
a sed
połą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 ls
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:
#!/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