सवाल बैच लिनक्स में पीएनजी को जेपीजी में परिवर्तित कर रहा है


क्या किसी को लिनक्स में जेपीजी में पीएनजी के समूह को बैच-कन्वर्ट करने का अच्छा तरीका पता है? (मैं उबंटू का उपयोग कर रहा हूं)।

एक png2jpg बाइनरी जो मैं सिर्फ एक शेल स्क्रिप्ट में छोड़ सकता हूं आदर्श होगा।


142
2017-11-16 02:06


मूल




जवाब:


आपका सबसे अच्छा शर्त उपयोग करना होगा ImageMagick

मैं वास्तविक उपयोग में एक विशेषज्ञ नहीं हूं, लेकिन मुझे पता है कि आप इससे संबंधित कुछ भी छवि कर सकते हैं!

एक उदाहरण है:

convert image.png image.jpg

और यह मूल और साथ ही परिवर्तित छवि को बनाए रखेगा। बैच के लिए के रूप में। मुझे लगता है कि आपको मोग्रिफ़ टूल का उपयोग करने की आवश्यकता है (उसी कमांड लाइन से जब छविमैगिक में)। ध्यान रखें कि यह अधिलेखित कर देता है पुरानी छवियां

आदेश है:

mogrify -format jpg *.png  

214
2017-11-16 02:15



बहुत बढ़िया, यह वही है जो मैं बाद में था और फिर से उपयोग करूँगा। वैसे, बस स्पष्ट करने के लिए क्योंकि मुझे यह नहीं पता था कि इसका मतलब क्या है: कनवर्ट का उपयोग एक अलग आउटपुट फ़ाइल उत्पन्न करने के लिए किया जाता है, मूल छवि को संशोधित करने के लिए mogrify का उपयोग किया जाता है। - nedned
पारदर्शी पृष्ठभूमि के साथ पीएनजी छवियों को सही ढंग से jpg में परिवर्तित नहीं करता है। - vishnu
पारदर्शी पृष्ठभूमि के साथ पीएनजी को बदलने के लिए, निम्न आदेश का उपयोग करें: mogrify -format jpg -background black -flatten *.png - hyperknot
मेरे लिनक्स बॉक्स पर @ केविनकॉक्स mogrify -format jpeg img.png मेरे पास 2 फाइलें हैं और file img.* एक पीएनजी, मूल छेड़छाड़ की रिपोर्ट, और एक नया जेपीजी रिपोर्ट करता है। इसलिए mogrify कर देता है नहीं इस मामले में मूल फाइलों को ओवरराइट करें। - neurino
से mogrify प्रलेखन: "यह उपकरण समान है convert सिवाय इसके कि मूल छवि फ़ाइल ओवरराइट की गई है (जब तक आप फ़ाइल प्रत्यय को बदल नहीं देते -format विकल्प) आपके द्वारा अनुरोध किए गए किसी भी बदलाव के साथ।" - janko-m


मेरे पास कुछ और समाधान हैं।

सबसे आसान समाधान पहले से ही पोस्ट की तरह है। पाश के लिए एक साधारण बाश।

for i in *.png ; do convert "$i" "${i%.*}.jpg" ; done

किसी कारण से मैं बैश में लूप से बचने के लिए प्रवृत्त हूं, इसलिए नाम-मैंगलिंग के लिए बैश का उपयोग करके, यहां एक और यूनिक्स xargs दृष्टिकोण है।

ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.*}.jpg"'

मैं उपयोग करता हूं। यह एक बार में कई नौकरियों को चलाने के लिए जीएनयू समानांतर का उपयोग करता है, जिससे आपको प्रदर्शन बढ़ावा मिलता है। यह कई प्रणालियों पर डिफ़ॉल्ट रूप से स्थापित है और लगभग निश्चित रूप से आपके रेपो में है (यह एक अच्छा कार्यक्रम है जो आसपास है)।

ls -1 *.png | parallel convert '{}' '{.}.jpg'

आपके पास प्रक्रियाओं की संख्या के लिए नौकरियों की संख्या डिफ़ॉल्ट है। मुझे अपने दोहरे कोर सिस्टम पर 3 नौकरियों का उपयोग करके बेहतर CPU उपयोग मिला।

ls -1 *.png | parallel -j 3 convert '{}' '{.}.jpg'

और यदि आप कुछ आंकड़े चाहते हैं (एक ईटीए, नौकरियां पूरी हुईं, प्रति नौकरी औसत समय ...)

ls -1 *.png | parallel --eta convert '{}' '{.}.jpg'

यदि आप जीएनयू समांतर का उपयोग कर रहे हैं तो एक वैकल्पिक वाक्यविन्यास भी है।

parallel convert '{}' '{.}.jpg' ::: *.png

और कुछ अन्य संस्करणों (डेबियन समेत) के लिए एक समान वाक्यविन्यास।

parallel convert '{}' '{.}.jpg' -- *.png

70
2018-01-28 02:45



इसके लिए सही बैश स्ट्रिंग विस्तार के लिए +1, अगर मैं आपको समानांतर का उल्लेख करने के लिए एक और अपवर्त दे सकता हूं, तो मैं चाहता हूं। एक टाइपो है, हालांकि - आपको एक की जरूरत है done लूप के लिए उसके अंत में। इसके अलावा, समांतर सामान के लिए, आप इसका उपयोग करने से बच सकते हैं ls और एक निर्माण के साथ पाइप की तरह: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png (देख यहाँ) - evilsoup
फिक्स्ड टाइपो। यह एक अच्छा वाक्यविन्यास है जिसे मैं नहीं जानता था। मुझे नहीं पता कि मुझे शायद यही कारण है कि मैं बैश में लूप का उपयोग न करना पसंद करता हूं। मैंने इसे समाधान दिया क्योंकि यह शायद अधिक "उचित" तरीका है लेकिन मैं शायद इसके साथ रहूंगा ls मेरे लिए विधि क्योंकि यह मेरे लिए अधिक समझ में आता है। - Kevin Cox
... हालांकि यह ध्यान दिया जाना चाहिए कि वाक्यविन्यास केवल जीएनयू समानांतर पर काम करता है। समानांतर जो कुछ लिनक्स डिस्ट्रोज़ (जैसे डेबियन और उबंटू) में पैक किया गया है, वास्तव में थोड़ा अलग वाक्यविन्यास (उपयोग का उपयोग करने वाला एक अलग संस्करण है) -- बजाय :::) - और फिर भी, यह निराशाजनक रूप से जीएनयू समानांतर की कुछ विशेषताओं की कमी है। - evilsoup
(हालांकि उन जीआरयू समानांतर पैकेज नहीं करते हैं जो निर्देशों का उपयोग करते हुए इसे आसानी से स्रोत से स्थापित कर सकते हैं यहाँ) - evilsoup
मुझे लगता है कि मुझे इसे वापस बदलना चाहिए ताकि यह यथासंभव कई संस्करणों के साथ काम करे। - Kevin Cox


convert कई लिनक्स वितरण पर पाए गए कमांड को ImageMagick सूट के हिस्से के रूप में स्थापित किया गया है। चलाने के लिए बैश कोड यहां दिया गया है convert निर्देशिका में सभी पीएनजी फाइलों पर और उस डबल एक्सटेंशन समस्या से बचें:

for img in *.png; do
    filename=${img%.*}
    convert "$filename.png" "$filename.jpg"
done

25
2017-11-16 03:28



कनवर्ट करने के लिए मैन पेज के अनुसार: "कन्वर्ट प्रोग्राम इमेजमैजिक (1) टूल के सूट का सदस्य है।" - nedned
तुम सही हो। किसी कारण से मैंने सोचा कि यह एक अलग पुस्तकालय का हिस्सा था। किसी भी तरह से जिस कोड को मैंने ऊपर पोस्ट किया है वह निर्देशिका के भीतर बैच रूपांतरण स्वचालित करने का सही तरीका है। - Marcin
आप उस आदेश को बेहतर बनाने के लिए बैश विस्तार का उपयोग कर सकते हैं जैसे: for f in *.png; do convert "$f" "${f/%png/jpg}"; done - evilsoup
बस याद रखें कि यह मामला संवेदनशील है। मेरा कैमरा इसे * .जेपीजी के रूप में नामित करता है और इसे पहले उदाहरण में नहीं समझा। - tsenapathy


वास्तविक "png2jpg"कमांड जिसे आप ढूंढ रहे हैं, वास्तव में दो आदेशों में विभाजित है pngtopnm तथा cjpeg, और वे का हिस्सा हैं netpbm तथा libjpeg-progs संकुल क्रमशः।

png2pnm foo.png | cjpeg > foo.jpeg

7
2017-11-16 05:29





tl; डॉ

उन लोगों के लिए जो सबसे सरल आदेश चाहते हैं:

बदलना तथा रखना मूल फाइलें:

mogrify -format jpg *.png

बदलना तथा हटाना मूल फाइलें:

mogrify -format jpg *.png && rm *.png

बैच कनवर्टिंग समझाया

किंडा देर से पार्टी के लिए, लेकिन सिर्फ किसी ऐसे व्यक्ति के लिए भ्रम को दूर करने के लिए जो क्ली के साथ बहुत सहज नहीं हो सकता है, यहां एक सुपर डंबेड-डाउन रेफरेंस और स्पष्टीकरण है।

उदाहरण निर्देशिका

bar.png
foo.png
foobar.jpg

सरल कनवर्ट करें

सभी मूल पीएनजी फ़ाइलों को रखता है साथ ही जेपीजी फाइल बनाता है।

mogrify -format jpg *.png

परिणाम

bar.png
bar.jpg
foo.png
foo.jpg
foobar.jpg

व्याख्या

  • mogrify का हिस्सा है ImageMagick छवि प्रसंस्करण के लिए उपकरणों का सूट।
    • प्रक्रियाओं छवियों mogrify जगह में, जिसका मतलब है कि मूल फ़ाइल ओवरराइट की गई है, इसके अपवाद के साथ -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 में समाप्त होने वाली सभी फाइलें)।

कनवर्ट करें और निकालें

सभी पीएनजी फ़ाइलों को jpg में परिवर्तित करता है, मूल को हटा देता है।

mogrify -format jpg *.png && rm *.png

परिणाम

bar.jpg
foo.jpg
foobar.jpg

व्याख्या

  • पहला भाग उपरोक्त जैसा सटीक है, यह नई जेपीजी फाइलें बनाएगा।
  • && एक बुलियन ऑपरेटर है। संक्षेप में:
    • जब कोई प्रोग्राम समाप्त हो जाता है, तो यह बाहर निकलने की स्थिति देता है। की स्थिति 0 मतलब कोई त्रुटि नहीं है।
    • जबसे && प्रदर्शन शॉर्ट सर्किट मूल्यांकन, सही हिस्सा केवल तभी किया जाएगा यदि कोई त्रुटि नहीं थी। यह उपयोगी है क्योंकि यदि आप उन्हें परिवर्तित करने में त्रुटि करते हैं तो आप सभी मूल फ़ाइलों को हटाना नहीं चाहेंगे।
  • rm आदेश फ़ाइलों को हटा देता है।

फैंसी सामान

अब यहां लोगों के लिए कुछ उपहार हैं कर रहे हैं क्ली के साथ आरामदायक।

यदि आप फाइलों को कनवर्ट करते समय कुछ आउटपुट चाहते हैं:

for i in *.png; do mogrify -format jpg "$i" && rm "$i"; echo "$i converted to ${i%.*}.jpg"; done

सभी उपनिर्देशिकाओं में सभी पीएनजी फ़ाइलों को कनवर्ट करें और प्रत्येक के लिए आउटपुट दें:

find . -iname '*.png' | while read i; do mogrify -format jpg "$i" && rm "$i"; echo "Converted $i to ${i%.*}.jpg"; done

सभी उपनिर्देशिकाओं में सभी पीएनजी फ़ाइलों को कनवर्ट करें, परिणामस्वरूप जेपीजी को सभी में डाल दें all निर्देशिका, उन्हें नंबर दें, मूल पीएनजी फाइलों को हटाएं, और प्रत्येक फ़ाइल के लिए आउटपुट प्रदर्शित करें:

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

7
2017-10-17 15:02



शायद सबसे अच्छा जवाब प्रदान किया गया है कि आप से छुटकारा पाएं while read भाग (इसे प्रतिस्थापित करें या इसे सभी को हटा दें) ... - don_crissti
@don_crissti, पढ़ने के दौरान क्या गलत है? - Steven Jeffries
यह त्रुटि प्रवण है (जब तक कि आप 100% सुनिश्चित न हों कि आप सेने फ़ाइल नामों से निपट रहे हैं) और धीमी (जैसे बहुत, बहुत धीमी)। - don_crissti
डिफ़ॉल्ट जेपीजी गुणवत्ता क्या है, और फ़ाइल टाइमस्टैम्प को कैसे संरक्षित किया जा सकता है? - Dan Dascalescu
@DanDascalescu उपर्युक्त विधियां (अंतिम को छोड़कर) फ़ाइल नामों को संरक्षित रखेगी, लेकिन उनके एक्सटेंशन को प्रतिस्थापित करें, इसलिए टाइमस्टैम्प की गई फ़ाइलें ठीक होनी चाहिए (हमेशा एक प्रतिलिपि बनाएं और पहले परीक्षण करें)। ImageMagick के अनुसार, "डिफ़ॉल्ट रूप से आपकी इनपुट छवि की अनुमानित गुणवत्ता का उपयोग करना है यदि इसे निर्धारित किया जा सकता है, अन्यथा 92" (imagemagick.org/script/command-line-options.php#quality) गुणवत्ता को गुणवत्ता के साथ निर्दिष्ट किया जा सकता है <संख्या> जहां <संख्या> 1 से 100 है। - Steven Jeffries


find . -name "*.png" -print0 | xargs -0 mogrify -format jpg -quality 50

4
2017-10-13 17:12



एक गहरी / पुनरावर्ती निर्देशिका के लिए धन्यवाद एक लाइन समाधान जो परिणामस्वरूप छोड़ देता है *.jpg मूल के बगल में फ़ाइलें *.png फाइलें, दिखाती हैं कि फ़ाइल आकार / गुणवत्ता को कैसे कम किया जाए और निर्देशिका या फ़ाइल नाम में किसी भी विषम वर्णों के कारण नहीं तोड़ता है। - Joel Purra


मेरा त्वरित समाधान for i in $(ls | grep .png); do convert $i $(echo $i.jpg | sed s/.png//g); done


3
2018-05-07 12:42



यह मैंने कभी देखा है सबसे उग्र, सबसे मजबूत कमांड लाइनों में से एक होना है - evilsoup
@Evilsoup ईमानदारी से, यह खोल स्क्रिप्ट के लिए सुरुचिपूर्ण है। इसका दावा करना उचित नहीं है। - Max Howell
@ मैक्सहोवेल मैन नहीं। यहां इसका एक सुंदर संस्करण होगा: for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done। यह पूरी तरह से अनावश्यक से बचाता है ls, grep तथा sed कॉल (और echo, लेकिन आईआईआरसी जो एक बैश बिल्टिन है और उसके पास कोई बहुत कम प्रदर्शन प्रभाव नहीं होगा), और दो पाइप और दो सबहेल से छुटकारा पाता है, तथा कम टाइपिंग शामिल है। यह कुछ और पोर्टेबल भी है, क्योंकि सभी संस्करण नहीं हैं ls पार्स करने के लिए सुरक्षित हैं। - evilsoup
@evilsoup मैं सही खड़ा हूँ! बहुत बढ़िया। - Max Howell