Yanıtlar:
En iyi bahis, Imagemagick'i kullanmak olacaktır.
Asıl kullanım konusunda uzman değilim, ancak bununla ilgili her şeyi yapabileceğinizi biliyorum!
Bir örnek:
convert image.png image.jpg
ve dönüştürülen görüntüyü oluşturmanın yanı sıra orijinali de koruyacaktır. Toplu gelince. Mogrify aracını kullanmanız gerektiğini düşünüyorum (imagemagick’de aynı komut satırından). Bunun eski görüntülerin üzerine yazdığını unutmayın .
Komut:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
2 dosyama ve file img.*
bir png, orjinal el değmemiş ve yeni bir jpeg rapor ettikten sonra . Yani mogrify
yok değil , bu durumda orijinal dosyaların üzerine.
mogrify
belgeler: " Bu araç benzerlik gösterir convert
(eğer dosya eki değiştirmedikçe orijinal resim dosyasının üzerine yazılır olduğunu hariç -Format Eğer talep değişikliklerle seçeneği). "
Birkaç çözümüm daha var.
En basit çözüm, en çok bildirildiği gibi. Döngü için basit bir bash.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Bazı nedenlerden ötürü bash döngülerinden kaçınmaya meyilliyim, bu yüzden isim yönetimi için bash kullanarak daha unixy xargs yaklaşımı var.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Kullandığım. Aynı anda birden fazla işi çalıştırmak için GNU Parallel'i kullanır ve size performans artışı sağlar. Varsayılan olarak birçok sisteme kurulur ve neredeyse kesinlikle repo'nuzda bulunur (çevrede olması iyi bir programdır).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
İşlerin sayısı, sahip olduğunuz işlemlerin sayısını değiştirir. Çift çekirdekli sistemimde 3 iş kullanarak daha iyi CPU kullanımı buldum.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Bazı istatistikler istiyorsanız (bir ETA, işler tamamlandı, iş başına ortalama süre ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
GNU Parallel kullanıyorsanız alternatif bir sözdizimi de vardır.
parallel convert '{}' '{.}.jpg' ::: *.png
Ve diğer bazı sürümler için benzer bir sözdizimi (debian dahil).
parallel convert '{}' '{.}.jpg' -- *.png
done
bunun için bir döngü gerekiyor. Ayrıca, paralel şeyler için, bunu ls
ve parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
ls
kendime göre bir yöntem kullanacağım çünkü bana daha mantıklı geliyor.
--
yerine kullanmak :::
) - ve o zaman bile, GNU paralelinin bazı özelliklerinden sinir bozucu bir şekilde yoksundur.
convert
Birçok Linux dağıtımı üzerinde bulunan komut ImageMagick paketinin bir parçası olarak yüklenir. İşte convert
bir dizindeki tüm PNG dosyalarında çalışacak bash kodu ve bu çift uzantı probleminden kaçının:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Sadece en basit komutları isteyenler için:
Orijinal dosyaları dönüştürün ve saklayın :
mogrify -format jpg *.png
Orijinal dosyaları dönüştürün ve kaldırın :
mogrify -format jpg *.png && rm *.png
Partiye geç kaldım, ama sadece cli ile çok rahat olmayan biri için tüm kafa karışıklığını gidermek için, işte size aptalca bir referans ve açıklama.
Örnek Dizin
bar.png
foo.png
foobar.jpg
Tüm orijinal png dosyalarını tutar ve jpg dosyaları oluşturur.
mogrify -format jpg *.png
Sonuç
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
açıklama
-format
seçenek hariç, orijinal dosyanın üzerine yazılır . (Gönderen sitede : 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
Seçenek biçimi değiştirmeden olacağını belirtir ve bir sonraki argüman (bu durumda, jpg) tipi olması gerekmektedir.*.png
girdi dosyalarıdır (.png ile biten tüm dosyalar).Tüm png dosyalarını jpg'ye dönüştürür, orijinali kaldırır.
mogrify -format jpg *.png && rm *.png
Sonuç
bar.jpg
foo.jpg
foobar.jpg
açıklama
&&
Bir boolean operatörüdür. Kısacası:
0
hata yok demektir.&&
gerçekleştirdiği kısa devre değerlendirmesinde ise, sağ kısmı sadece yapılacak hiç hata yoktur . Bu, kullanışlıdır, çünkü dönüştürmekte bir hata varsa, tüm orijinal dosyaları silmek istemeyebilirsiniz.rm
Komut dosyaları siler.Şimdi burada insanlar için bazı güzellikler var olan cli ile rahat.
Dosyaları dönüştürürken bir miktar çıktı almak istiyorsanız:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Tüm alt dizinlerdeki tüm png dosyalarını dönüştürün ve her birine çıktı verin:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Tüm alt dizinlerdeki tüm png dosyalarını dönüştürün, elde edilen tüm jpgs'leri all
dizine yerleştirin, numaralandırın, orijinal png dosyalarını kaldırın ve gerçekleştiği gibi her dosya için çıktıyı görüntüleyin:
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
parçadan kurtulmak kaydıyla (değiştirmek ya da hepsini birlikte kaldırmak) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
Özgün / özyinelemeli bir dizin için sonuçta ortaya çıkan dosyaları orijinal dosyaların yanında bırakan tek satırlı bir çözüm için teşekkürler *.png
, dosya boyutunu / kalitesini nasıl azaltacağını gösterir ve dizin veya dosya adındaki tuhaf karakterler nedeniyle bozulmaz.
hızlı çözümüm
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
. Bu tamamen gereksiz önler ls
, grep
ve sed
aramaları (ve echo
fakat yerleşik bir bash olduğunu ve bu yüzden / hayır çok az performans etkisi olacak IIRC) ve iki boru ve iki altkabuklarda kurtulur, ve daha az yazar içerir. Tüm sürümleri ls
ayrıştırmak güvenli olmadığından, biraz daha taşınabilir .
Yıllar geç kaldı, özellikle bu amaçla yazdığım png2jpeg bir yardımcı programı var .
Kodun @Marcin tarafından uyarlanması:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Toplu işlem için:
for img in *.png; do
convert "$img" "$img.jpg"
done
Yine de image1.png.jpg gibi bir dosya adı bulursunuz.
Bu bash olarak çalışacak ve belki de burne. Diğer mermileri bilmiyorum ama tek fark döngü sözdizimi olabilir.
Dosyalar birden fazla dizine yayıldığında dönüştürmek için kullandığım şey budur. Orijinalim TGA'dan PNG'ye
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Konsept, find
ihtiyacınız olan dosyaları açar, uzantıyı çıkartır ve sonra tekrar eklersiniz xargs
. Böylece PNG’nin JPG’si için uzantıları değiştirirsiniz ve alfa kanallarıyla başa çıkmak için ek bir şey yaparsınız (arkaplanı beyaza ayarlar) (bu örnekte beyaz olarak değiştirebilirsiniz)
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg