बैच PNG को JPG को linux में परिवर्तित करना


163

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

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

जवाबों:


237

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

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

एक उदाहरण है:

convert image.png image.jpg

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

आदेश है:

mogrify -format jpg *.png  

7
बहुत बढ़िया, यह वही है जो मैं बाद में था और फिर से उपयोग करूंगा। वैसे, स्पष्ट करने के लिए जैसा कि मुझे यह महसूस नहीं हुआ कि आपका क्या मतलब है: कन्वर्ट का उपयोग एक अलग आउटपुट फ़ाइल उत्पन्न करने के लिए किया जाता है, मूल छवि को संशोधित करने के लिए मोग्रिफ़ का उपयोग किया जाता है।
nedned

1
पारदर्शी पृष्ठभूमि वाली png छवियां ठीक से jpg में परिवर्तित नहीं होती हैं।
विष्णु

4
पीएनजी की पारदर्शी पृष्ठभूमि के साथ परिवर्तित करने के लिए, निम्न कमांड का उपयोग करें:mogrify -format jpg -background black -flatten *.png
हाइपरनॉट

3
मेरे mogrify -format jpeg img.pngफाइल बॉक्स पर @ केविनकोक्स 2 फाइलें होने के बाद और file img.*एक पीएनजी, मूल अछूता, और एक नया एमपीईजी एक रिपोर्ट करता है। तो इस मामले में मूल फ़ाइलों को अधिलेखित नहींmogrify करता है ।
न्यूरिनो

4
से mogrifyप्रलेखन: " यह उपकरण समान है convert, सिवाय इसके कि मूल छवि फ़ाइल ओवरराइट है (जब तक आप के साथ फ़ाइल प्रत्यय बदल -format कोई भी परिवर्तन आप अनुरोध के साथ विकल्प)। "
जान्को मीटर

82

मेरे पास कुछ और उपाय हैं।

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

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

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

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

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

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

आपके द्वारा की जाने वाली प्रक्रियाओं की संख्या के अनुसार नौकरियों की संख्या में कमी आती है। मैंने अपने दोहरे-कोर सिस्टम पर 3 नौकरियों का उपयोग करके बेहतर सीपीयू उपयोग पाया।

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

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

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

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

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

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

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

2
+1 के लिए सही बैश स्ट्रिंग विस्तार के लिए, अगर मैं आपको समानांतर उल्लेख करने के लिए एक और उत्थान दे सकता हूं, तो मैं करूंगा। हालांकि, एक टाइपो है - आपको doneलूप के लिए इसके अंत में आवश्यकता है । इसके अलावा, समानांतर सामान के लिए, आप lsएक निर्माण के साथ उस और पाइप का उपयोग करने से बच सकते हैं: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png( यहां देखें )
evilsoup

फिक्स्ड टाइपो। यह एक शांत वाक्यविन्यास है जो मुझे नहीं पता था। मुझे नहीं पता कि मुझे कौन सा बेहतर लगता है शायद यही कारण है कि मैं बैश में लूप्स का उपयोग नहीं करना पसंद करता हूं। मैंने इसे हल कर दिया क्योंकि यह शायद अधिक "उचित" तरीका है, लेकिन मैं शायद lsखुद के लिए विधि के साथ रहूंगा क्योंकि यह मेरे लिए अधिक समझ में आता है।
केविन कॉक्स

1
... हालांकि यह ध्यान दिया जाना चाहिए कि सिंटैक्स केवल जीएनयू समानांतर पर काम करता है। समानांतर जो कुछ लिनक्स डिस्ट्रोस (जैसे डेबियन और उबंटू) में पैक किया गया है, वास्तव में थोड़ा अलग सिंटैक्स (उपयोग के --बजाय :::) के साथ एक अलग संस्करण है - और फिर भी, यह निराशाजनक रूप से जीएनयू समानांतर की कुछ विशेषताओं का अभाव है।
evilsoup

(हालांकि
डिस्ट्रोस

मुझे लगता है कि मुझे इसे फिर से बदलना चाहिए ताकि यह अधिक से अधिक संस्करणों के साथ काम करे।
केविन कॉक्स

26

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

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

8
कन्वर्ट के लिए मैन पेज के अनुसार: "कन्वर्ट प्रोग्राम इमेजमैजिक (1) सुइट्स ऑफ टूल्स का सदस्य है।"
4

1
तुम सही हो। किसी कारण से मुझे लगा कि यह एक अलग पुस्तकालय का हिस्सा है। किसी भी तरह से मैंने जो कोड ऊपर पोस्ट किया है वह एक निर्देशिका के भीतर बैच रूपांतरण को स्वचालित करने का सही तरीका है।
मार्सिन

2
आप उस कमांड को बेहतर बनाने के लिए बैश विस्तार का उपयोग कर सकते हैं जैसे:for f in *.png; do convert "$f" "${f/%png/jpg}"; done
evilsoup

बस याद रखें कि यह संवेदनशील मामला है। मेरे कैमरे ने इसे * .JPG नाम दिया है और पहली बार में इसका एहसास नहीं हुआ।
tsenapathy 1

10

tl; डॉ

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

मूल फ़ाइलें कनवर्ट करें और रखें :

mogrify -format jpg *.png

मूल फ़ाइलों को कनवर्ट करें और निकालें :

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

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

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

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

bar.png
foo.png
foobar.jpg

सिंपल कन्वर्ट

सभी मूल png फ़ाइलों को रखता है और साथ ही साथ 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 में समाप्त होने वाली सभी फाइलें) हैं।

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

सभी png फ़ाइलों को jpg में रूपांतरित करता है, मूल को हटाता है।

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

नतीजा

bar.jpg
foo.jpg
foobar.jpg

व्याख्या

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

फैंसी सामान

अब यहाँ लोग हैं, जो करने के लिए कुछ उपहार है कर रहे हैं CLI के साथ सहज।

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

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

संभवतः सबसे अच्छा उत्तर, बशर्ते आप while readभाग से छुटकारा पा लें (इसे बदलें या इसे सभी को एक साथ हटा दें) ...
don_crissti

@don_crissti, पढ़ते समय क्या गलत है?
स्टीवन जेफ्रीज

यह त्रुटि प्रवण है (जब तक कि आप 100% सुनिश्चित नहीं हैं कि आप साने फ़ाइल नामों के साथ काम कर रहे हैं) और धीमे (जैसे बहुत, बहुत, बहुत धीमे)।
दान_क्रांति

डिफ़ॉल्ट JPG गुणवत्ता क्या है, और टाइमस्टैम्प को कैसे संरक्षित किया जा सकता है?
दान डैस्कलेस्कु

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

8

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

png2pnm foo.png | cjpeg > foo.jpeg

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

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

5

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


2
यह सबसे बदसूरत, सबसे जटिल कमांड-लाइन में से एक है, जिसे मैंने कभी देखा है
evilsoup

1
ईमानदारी से @evilsoup, यह शेल स्क्रिप्ट के लिए सुरुचिपूर्ण है। यह दावा किया जाता है कि यह उचित नहीं है।
मैक्स हॉवेल

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

@evilsoup मैं सही खड़ा हूँ! बहुत बढ़िया।
मैक्स हॉवेल

4

कई साल बहुत देर हो चुकी है, इस उद्देश्य के लिए विशेष रूप से एक png2jpeg उपयोगिता है, जिसे मैंने लिखा था।

@Marcin द्वारा कोड को अपनाना:

#!/bin/sh

for img in *.png
do
    filename=${img%.*}
    png2jpeg -q 95 -o "$filename.jpg" "$filename.png"
done

3

बैच प्रसंस्करण के लिए:

for img in *.png; do
  convert "$img" "$img.jpg"
done

आप फ़ाइल नाम जैसे image1.png.jpg के साथ समाप्त करेंगे।

यह बाश में काम करेगा, और शायद बोर्न में। मैं अन्य गोले के बारे में नहीं जानता, लेकिन केवल अंतर लूप सिंटैक्स होगा।


1

जब फ़ाइलों को एक से अधिक निर्देशिका में बदलने के लिए मैं इसका उपयोग करता हूं। मेरा मूल एक पीएनजी के लिए TGA था

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.