ไม่มีใครรู้วิธีที่ดีในการแปลงชุด PNGs เป็น JPGs ใน linux (ฉันใช้ Ubuntu)
ไบนารี png2jpg ที่ฉันสามารถวางลงในเชลล์สคริปต์จะเหมาะ
ไม่มีใครรู้วิธีที่ดีในการแปลงชุด PNGs เป็น JPGs ใน linux (ฉันใช้ Ubuntu)
ไบนารี png2jpg ที่ฉันสามารถวางลงในเชลล์สคริปต์จะเหมาะ
คำตอบ:
ทางออกที่ดีที่สุดของคุณคือใช้Imagemagick
ฉันไม่ใช่ผู้เชี่ยวชาญในการใช้งานจริง แต่ฉันรู้ว่าคุณสามารถทำรูปภาพเกี่ยวกับสิ่งนี้ได้!
ตัวอย่างคือ:
convert image.png image.jpg
และมันจะเก็บต้นฉบับไว้เช่นเดียวกับการสร้างภาพที่ถูกแปลง สำหรับชุด ฉันคิดว่าคุณต้องใช้เครื่องมือ Mogrify (จากบรรทัดคำสั่งเดียวกันเมื่ออยู่ใน imagemagick) โปรดทราบว่าสิ่งนี้จะเขียนทับภาพเก่า
คำสั่งคือ:
mogrify -format jpg *.png
mogrify -format jpg -background black -flatten *.png
mogrify -format jpeg img.png
ฉันมี 2 ไฟล์และfile img.*
รายงานหนึ่ง png, ไม่มีใครแตะต้องต้นฉบับและ jpeg ใหม่ ดังนั้นmogrify
ไม่ได้เขียนทับไฟล์เดิมในกรณีนี้
mogrify
เอกสาร " เครื่องมือนี้จะคล้ายกับconvert
ยกเว้นว่าไฟล์ภาพต้นฉบับจะถูกเขียนทับ (เว้นแต่คุณจะเปลี่ยนคำต่อท้ายไฟล์ที่มีการทำการฟอร์แมตตัวเลือก) มีการเปลี่ยนแปลงใด ๆ ที่คุณขอ. "
ฉันมีทางออกเพิ่มเติมสองสามข้อ
ทางออกที่ง่ายที่สุดเหมือนโพสต์ที่มีอยู่แล้วมากที่สุด ทุบตีง่ายสำหรับวง
for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done
ด้วยเหตุผลบางอย่างฉันมักจะหลีกเลี่ยงการวนซ้ำในการทุบตีดังนั้นนี่คือวิธี xargs unixy มากขึ้นโดยใช้ทุบตีสำหรับชื่อ mangling
ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'
คนที่ฉันใช้ มันใช้ GNU Parallel ในการเรียกใช้งานหลายงานพร้อมกันเพื่อเพิ่มประสิทธิภาพให้กับคุณ มันถูกติดตั้งโดยค่าเริ่มต้นในหลาย ๆ ระบบและเกือบจะแน่นอนใน repo ของคุณ (มันเป็นโปรแกรมที่ดีที่จะมีรอบ)
ls -1 *.png | parallel convert '{}' '{.}.jpg'
จำนวนงานเริ่มต้นที่จำนวนกระบวนการที่คุณมี ฉันพบการใช้ CPU ที่ดีขึ้นโดยใช้ 3 งานในระบบดูอัลคอร์ของฉัน
ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'
และถ้าคุณต้องการสถิติบางอย่าง (ETA งานเสร็จเวลาเฉลี่ยต่องาน ... )
ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'
นอกจากนี้ยังมีไวยากรณ์ทางเลือกถ้าคุณใช้ GNU Parallel
parallel convert '{}' '{.}.jpg' ::: *.png
และไวยากรณ์ที่คล้ายกันสำหรับเวอร์ชันอื่น (รวมถึงเดเบียน)
parallel convert '{}' '{.}.jpg' -- *.png
done
ท้ายสุดของลูป นอกจากนี้สำหรับสิ่งขนานคุณสามารถหลีกเลี่ยงการใช้ls
และท่อที่มีโครงสร้างเช่น: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png
(ดูที่นี่ )
ls
วิธีการของตัวเองเพราะมันเหมาะสมกว่าสำหรับฉัน
--
มากกว่า:::
) - และถึงกระนั้นมันก็ขาดคุณสมบัติบางอย่างของ GNU ขนาน
convert
คำสั่งที่พบบนลินุกซ์จำนวนมากถูกติดตั้งเป็นส่วนหนึ่งของชุด ImageMagick นี่คือรหัสทุบตีที่ใช้convert
ในไฟล์ PNG ทั้งหมดในไดเรกทอรีและหลีกเลี่ยงปัญหาส่วนขยายซ้ำ:
for img in *.png; do
filename=${img%.*}
convert "$filename.png" "$filename.jpg"
done
for f in *.png; do convert "$f" "${f/%png/jpg}"; done
สำหรับผู้ที่ต้องการคำสั่งที่ง่ายที่สุด:
แปลงและเก็บไฟล์ต้นฉบับ:
mogrify -format jpg *.png
แปลงและลบไฟล์ต้นฉบับ:
mogrify -format jpg *.png && rm *.png
สายไปงานเลี้ยง แต่เพียงเพื่อขจัดความสับสนทั้งหมดสำหรับคนที่อาจไม่สะดวกกับ cli นี่เป็นข้อมูลอ้างอิงและคำอธิบายที่โง่เขลาสุด ๆ
ตัวอย่างไดเรกทอรี
bar.png
foo.png
foobar.jpg
เก็บไฟล์ png ดั้งเดิมทั้งหมดรวมทั้งสร้างไฟล์ jpg
mogrify -format jpg *.png
ผลลัพธ์
bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg
คำอธิบาย
-format
ตัวเลือก (จากเว็บไซต์ : 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
ตัวเลือกที่ระบุว่าคุณจะมีการเปลี่ยนแปลงรูปแบบและข้อโต้แย้งต่อไปจะต้องมีการพิมพ์ (ในกรณีนี้, jpg)*.png
คือไฟล์อินพุต (ไฟล์ทั้งหมดที่ลงท้ายด้วย. png)แปลงไฟล์ png ทั้งหมดเป็น jpg ลบต้นฉบับ
mogrify -format jpg *.png && rm *.png
ผลลัพธ์
bar.jpg
foo.jpg
foobar.jpg
คำอธิบาย
&&
เป็นผู้ประกอบการบูลีน ในระยะสั้น:
0
หมายถึงไม่มีข้อผิดพลาด&&
ทำการประเมินการลัดวงจรส่วนที่เหมาะสมจะถูกดำเนินการก็ต่อเมื่อไม่มีข้อผิดพลาดเท่านั้น สิ่งนี้มีประโยชน์เพราะคุณอาจไม่ต้องการลบไฟล์ต้นฉบับทั้งหมดหากมีข้อผิดพลาดในการแปลงไฟล์rm
คำสั่งลบไฟล์ตอนนี้ที่นี่สารพัดบางอย่างสำหรับคนที่มีความสะดวกสบายด้วย CLI
หากคุณต้องการเอาต์พุตบางอย่างในขณะที่กำลังแปลงไฟล์:
for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done
แปลงไฟล์ png ทั้งหมดในไดเรกทอรีย่อยทั้งหมดและให้เอาต์พุตสำหรับแต่ละไฟล์:
find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done
แปลงไฟล์ png ทั้งหมดในไดเรกทอรีย่อยทั้งหมดใส่ jpgs ที่เป็นผลลัพธ์ทั้งหมดลงในall
ไดเรกทอรีให้วางหมายเลขลบไฟล์ png ดั้งเดิมและแสดงผลลัพธ์สำหรับแต่ละไฟล์ตามที่เกิดขึ้น:
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
ส่วน (แทนที่มันหรือลบมันทั้งหมดเข้าด้วยกัน) ...
png2jpg
คำสั่งจริง " " ที่คุณกำลังค้นหาอยู่ในความเป็นจริงแบ่งออกเป็นสองคำสั่งที่เรียกว่าpngtopnm
และcjpeg
และเป็นส่วนหนึ่งของnetpbm
และlibjpeg-progs
แพ็คเกจตามลำดับ
png2pnm foo.png | cjpeg > foo.jpeg
find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50
*.jpg
ไฟล์ผลลัพธ์ไว้ถัดจาก*.png
ไฟล์ต้นฉบับแสดงวิธีลดขนาด / คุณภาพของไฟล์และไม่แตกเพราะอักขระแปลก ๆ ในไดเรกทอรีหรือชื่อไฟล์
ทางออกที่รวดเร็วของฉัน
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
ฉบับที่นี่จะเป็นรุ่นที่สง่างามของนี้: ที่หลีกเลี่ยงไม่จำเป็นครบถ้วนls
, grep
และsed
การโทร (และecho
แต่ IIRC ที่เป็น builtin ทุบตีและอื่น ๆ จะไม่มี / ผลกระทบต่อประสิทธิภาพน้อยมาก) และได้รับการกำจัดของทั้งสองท่อและสอง subshells, และเกี่ยวข้องกับการพิมพ์น้อย มันพกพาได้มากกว่าเดิมเล็กน้อยเนื่องจากไม่ใช่ทุกเวอร์ชั่นls
ที่จะแยกวิเคราะห์ได้อย่างปลอดภัย
หลายปีสายเกินไปมียูทิลิตีpng2jpegสำหรับจุดประสงค์นี้โดยเฉพาะซึ่งฉันเขียน
การปรับรหัสโดย @Marcin:
#!/bin/sh
for img in *.png
do
filename=${img%.*}
png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done
สำหรับการประมวลผลแบทช์:
for img in *.png; do
convert "$img" "$img.jpg"
done
คุณจะจบลงด้วยชื่อไฟล์เช่น image1.png.jpg
นี้จะทำงานในทุบตีและอาจ bourne ฉันไม่รู้เกี่ยวกับเชลล์ตัวอื่น แต่ความแตกต่างเพียงอย่างเดียวน่าจะเป็นไวยากรณ์ลูป
นี่คือสิ่งที่ฉันใช้ในการแปลงเมื่อไฟล์ครอบคลุมมากกว่าหนึ่งไดเรกทอรี อันแรกของฉันคือ TGA ถึง PNG
find . -name "*.tga" -type f | sed 's/\.tga$//' | xargs -I% convert %.tga %.png
แนวคิดคือคุณไฟล์ที่คุณต้องการเปลื้องผ้านามสกุลแล้วเพิ่มกลับไปอยู่กับfind
xargs
ดังนั้นสำหรับ PNG ถึง JPG คุณจะต้องเปลี่ยนนามสกุลและทำสิ่งพิเศษอย่างหนึ่งในการจัดการกับช่องอัลฟาคือการตั้งค่าพื้นหลัง (ในตัวอย่างนี้เป็นสีขาว แต่คุณสามารถเปลี่ยนได้) จากนั้นปรับภาพให้เรียบ
find . -name "*.png" -type f | sed 's/\.png$//' | xargs -I% convert %.png -background white -flatten %.jpg