Jawaban:
Taruhan terbaik Anda adalah menggunakan Imagemagick
Saya bukan ahli dalam penggunaan aktual, tetapi saya tahu Anda bisa melakukan banyak hal terkait gambar ini!
Contohnya adalah:
convert image.png image.jpg
dan itu akan menjaga yang asli serta membuat gambar yang dikonversi. Adapun batch. Saya pikir Anda perlu menggunakan alat Mogrify (dari baris perintah yang sama ketika di imagemagick). Perlu diingat bahwa ini menimpa gambar lama.
Perintahnya adalah:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.pngsaya memiliki 2 file dan file img.*melaporkan satu png, yang asli tidak tersentuh, dan yang baru jpeg. Jadi mogrifytidak tidak menimpa file asli dalam kasus ini.
mogrifydokumentasi: " Alat ini serupa dengan convertkecuali bahwa file gambar asli ditimpa (kecuali Anda mengubah akhiran file dengan opsi -format ) dengan perubahan apa pun yang Anda minta. "
Saya punya beberapa solusi lagi.
Solusi paling sederhana adalah seperti kebanyakan sudah diposting. Bash sederhana untuk loop.
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
Untuk beberapa alasan saya cenderung menghindari loop di bash jadi di sini adalah pendekatan xargs yang lebih unixy, menggunakan bash untuk nama-mangling.
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
Yang saya gunakan. Ini menggunakan GNU Parallel untuk menjalankan banyak pekerjaan sekaligus, memberi Anda peningkatan kinerja. Ini diinstal secara default pada banyak sistem dan hampir pasti di repo Anda (ini adalah program yang bagus untuk dimiliki).
ls -1 *.png | parallel convert '{}' '{.}.jpg'
Jumlah pekerjaan default ke jumlah proses yang Anda miliki. Saya menemukan penggunaan CPU yang lebih baik menggunakan 3 pekerjaan pada sistem dual-core saya.
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
Dan jika Anda menginginkan beberapa statistik (ETA, pekerjaan selesai, waktu rata-rata per pekerjaan ...)
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
Ada juga sintaks alternatif jika Anda menggunakan GNU Parallel.
parallel convert '{}' '{.}.jpg' ::: *.png
Dan sintaksis yang serupa untuk beberapa versi lain (termasuk debian).
parallel convert '{}' '{.}.jpg' -- *.png
donedi akhir untuk loop. Juga, untuk hal-hal paralel, Anda bisa menghindari menggunakan itu lsdan pipa dengan konstruk seperti: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png(lihat di sini )
lsmetode untuk diri saya sendiri karena lebih masuk akal bagi saya.
--daripada :::) - dan bahkan kemudian, secara frustasi tidak memiliki beberapa fitur paralel GNU.
The convertperintah yang ditemukan pada banyak distribusi Linux diinstal sebagai bagian dari ImageMagick suite. Inilah kode bash untuk dijalankan convertpada semua file PNG dalam direktori dan hindari masalah ekstensi ganda:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
Bagi mereka yang hanya menginginkan perintah paling sederhana:
Konversi dan simpan file asli:
mogrify -format jpg *.png
Konversi dan hapus file asli:
mogrify -format jpg *.png && rm *.png
Agak terlambat ke pesta, tetapi hanya untuk menjernihkan semua kebingungan bagi seseorang yang mungkin tidak terlalu nyaman dengan cli, berikut ini adalah referensi dan penjelasan yang sangat bodoh.
Direktori Contoh
bar.png
foo.png
foobar.jpg
Menyimpan semua file png asli serta membuat file jpg.
mogrify -format jpg *.png
Hasil
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
Penjelasan
-formatopsi. (Dari situs : This tool is similar to convert except that the original image file is overwritten (unless you change the file suffix with the -format option))- formatpilihan menentukan bahwa Anda akan mengubah format, dan argumen berikutnya perlu jenis (dalam hal ini, jpg).*.pngadalah file input (semua file berakhiran .png).Mengonversi semua file png ke jpg, menghapus yang asli.
mogrify -format jpg *.png && rm *.png
Hasil
bar.jpg
foo.jpg
foobar.jpg
Penjelasan
&&adalah operator boolean. Pendeknya:
0berarti tidak ada kesalahan.&&melakukan evaluasi hubung singkat , bagian kanan hanya akan dilakukan jika tidak ada kesalahan . Ini berguna karena Anda mungkin tidak ingin menghapus semua file asli jika ada kesalahan mengonversi mereka.rmperintah menghapus file.Sekarang inilah beberapa barang untuk orang-orang yang yang nyaman dengan cli tersebut.
Jika Anda ingin output saat mengonversi file:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
Konversikan semua file png di semua subdirektori dan berikan output untuk masing-masingnya:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
Konversikan semua file png di semua subdirektori, masukkan semua jpg yang dihasilkan ke dalam alldirektori , beri nomor, hapus file png asli, dan tampilkan output untuk setiap file saat terjadi:
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 readbagian tersebut (ganti atau hapus semuanya) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpgfile yang dihasilkan di sebelah file asli *.png, menunjukkan cara mengurangi ukuran / kualitas file dan tidak pecah karena ada karakter aneh dalam direktori atau nama file.
solusi cepat saya
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. Itu menghindari yang benar-benar tidak perlu ls, grepdan sedpanggilan (dan echo, tapi IIRC itu adalah bash builtin dan karenanya tidak akan memiliki / sangat sedikit dampak kinerja), dan menghilangkan dua pipa dan dua subkulit, dan melibatkan kurang mengetik. Ini bahkan sedikit lebih portabel, karena tidak semua versi lsaman untuk diuraikan.
Bertahun-tahun terlambat, ada utilitas png2jpeg khusus untuk tujuan ini, yang saya tulis.
Mengadaptasi kode oleh @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
Untuk pemrosesan batch:
for img in *.png; do
convert "$img" "$img.jpg"
done
Anda akan berakhir dengan nama file seperti image1.png.jpg.
Ini akan bekerja di bash, dan mungkin bourne. Saya tidak tahu tentang shell lain, tetapi satu-satunya perbedaan adalah sintaks loop.
Ini yang saya gunakan untuk mengonversi ketika file menjangkau lebih dari satu direktori. Yang asli saya adalah TGA ke PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
Konsepnya adalah Anda findfile yang Anda butuhkan, menanggalkan ekstensi lalu menambahkannya kembali xargs. Jadi untuk PNG ke JPG, Anda akan mengubah ekstensi dan melakukan satu hal tambahan untuk menangani saluran alfa yaitu mengatur latar belakang (dalam contoh ini putih, tetapi Anda dapat mengubahnya) kemudian ratakan gambar
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg