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.png
saya memiliki 2 file dan file img.*
melaporkan satu png, yang asli tidak tersentuh, dan yang baru jpeg. Jadi mogrify
tidak tidak menimpa file asli dalam kasus ini.
mogrify
dokumentasi: " Alat ini serupa dengan convert
kecuali 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
done
di akhir untuk loop. Juga, untuk hal-hal paralel, Anda bisa menghindari menggunakan itu ls
dan pipa dengan konstruk seperti: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(lihat di sini )
ls
metode untuk diri saya sendiri karena lebih masuk akal bagi saya.
--
daripada :::
) - dan bahkan kemudian, secara frustasi tidak memiliki beberapa fitur paralel GNU.
The convert
perintah yang ditemukan pada banyak distribusi Linux diinstal sebagai bagian dari ImageMagick suite. Inilah kode bash untuk dijalankan convert
pada 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
-format
opsi. (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)
)- format
pilihan menentukan bahwa Anda akan mengubah format, dan argumen berikutnya perlu jenis (dalam hal ini, jpg).*.png
adalah 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:
0
berarti 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.rm
perintah 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 all
direktori , 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 read
bagian tersebut (ganti atau hapus semuanya) ...
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
file 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
, grep
dan sed
panggilan (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 ls
aman 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 find
file 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