سؤال دفعة تحويل PNG إلى JPG في لينكس


هل يعرف أي شخص طريقة جيدة لتحويل دفعة مجموعة من PNGs إلى ملفات JPG في نظام التشغيل Linux؟ (أنا أستخدم أوبونتو).

سيكون ثنائي png2jpg ثنائي أنني يمكن أن تسقط فقط في النصي قذيفة يكون مثاليا.


142
2017-11-16 02:06


الأصل




الأجوبة:


سيكون أفضل رهان لاستخدام يماغيماغيك

أنا لست خبيرًا في الاستخدام الفعلي ، لكنني أعرف أنه يمكنك فعلًا أي شيء متعلق بهذه الصورة!

مثال هو:

convert image.png image.jpg

وستحتفظ النسخة الأصلية بالإضافة إلى إنشاء الصورة المحولة. كما لدفعة. أعتقد أنك بحاجة إلى استخدام أداة Mogrify (من نفس سطر الأوامر عندما تكون في imagemagick). ضع في اعتبارك أن هذا ينمق الصور القديمة.

الأمر هو:

mogrify -format jpg *.png  

214
2017-11-16 02:15



رائع ، هذا هو بالضبط ما كنت بعد وسوف تستخدم مرة أخرى. بالمناسبة ، فقط للتوضيح كما لم أكن أدرك أن هذا ما قصدته: يتم استخدام تحويل لإنشاء ملف إخراج منفصل ، يتم استخدام mogrify لتعديل الصورة الأصلية. - nedned
لا يتم تحويل الصور png ذات الخلفية الشفافة بشكل صحيح إلى jpg. - vishnu
لتحويل PNG's مع خلفية شفافة ، استخدم الأمر التالي: mogrify -format jpg -background black -flatten *.png - hyperknot
KevinCox على بلدي لينكس مربع بعد mogrify -format jpeg img.png لدي 2 ملفات و file img.* تقارير بابوا نيو غينيا ، الأصلي يمسها ، وجي بي بي واحد جديد. وبالتالي mogrify هل ليس الكتابة فوق الملفات الأصلية في هذه الحالة. - neurino
من عند mogrify كابل بيانات: "هذه الأداة هي مشابهة ل convert باستثناء أن ملف الصورة الأصلية يتم الكتابة فوقه (إلا إذا قمت بتغيير لاحقة الملف بـ -شكل الخيار) مع أي تغييرات تطلبها." - janko-m


لدي بضعة حلول أكثر.

أبسط حل هو مثل معظم نشر بالفعل. باش بسيط للحلقة.

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

لسبب ما ، أميل إلى تجنب الحلقات في bash حتى هنا هو نهج xargs unixy أكثر ، وذلك باستخدام bash لتسمية الاسم.

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

واحد أنا استخدم. ويستخدم GNU Parallel لتشغيل وظائف متعددة في وقت واحد ، مما يمنحك دفعة للأداء. يتم تثبيته افتراضيا على العديد من الأنظمة ، ويكاد يكون في ريبو الخاص بك (وهو برنامج جيد أن يكون حولها).

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

عدد الوظائف الافتراضية هو عدد العمليات التي لديك. لقد وجدت أفضل استخدام وحدة المعالجة المركزية باستخدام 3 وظائف في نظام ثنائي النواة.

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

وإذا كنت ترغب في الحصول على بعض الإحصائيات (إيتا ، إنجاز المهام ، متوسط ​​الوقت لكل وظيفة ...)

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

هناك أيضًا صيغة بديلة إذا كنت تستخدم GNU Parallel.

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

وبناء مماثل لبعض الإصدارات الأخرى (بما في ذلك ديبيان).

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

70
2018-01-28 02:45



إجراء 1+ لتوسيع سلسلة bash الصحيحة في لـ ، إذا كان بإمكاني إعطائك ترقية أخرى لذكرها بالتوازي ، سأفعل. هناك واحد مطبعي ، ولكن - تحتاج إلى done في نهاية ذلك للحلقة. أيضا ، بالنسبة للأشياء المتوازية ، يمكنك تجنب استخدام ذلك ls والأنبوب مع بناء مثل: parallel -j 3 --eta convert '{}' '{.}.jpg' ::: *.png (نرى هنا) - evilsoup
خطأ مطبعي ثابت. هذا هو بناء الجملة البارد الذي لم أكن أعرفه. أنا لا أعرف أي واحد أحب أفضل ربما لنفس السبب الأول يفضل عدم استخدام الحلقات في باش. أنا وضعت عليه الحل لأنه ربما يكون أكثر طريقة "مناسبة" ولكن ربما سألتزم مع ls طريقة لنفسي لأنه أكثر منطقية بالنسبة لي. - Kevin Cox
... على الرغم من أنه يجب الإشارة إلى أن هذا النحو يعمل فقط على جنو على التوازي. المتوازي المعبأ في بعض توزيعات linux (مثل Debian & Ubuntu) هو في الواقع نسخة مختلفة مع تركيب مختلف قليلاً (استخدم --عوضا عن :::) - وحتى ذلك الحين ، فإنه يفتقر إلى بعض ميزات GNU المتوازية. - evilsoup
(على الرغم من أن تلك الموجودة على توزيعات لا تحزم جنو متوازي يمكن تثبيتها من المصدر بسهولة تامة ، وذلك باستخدام التعليمات هنا) - evilsoup
أعتقد أنني يجب أن أغيره في ذلك الوقت بحيث يعمل مع أكبر عدد ممكن من الإصدارات. - Kevin Cox


ال convert يتم تثبيت الأمر الموجود في العديد من توزيعات Linux كجزء من مجموعة ImageMagick. هنا هو رمز باش لتشغيل convert على جميع ملفات PNG في دليل وتجنب مشكلة الإضافة المزدوجة هذه:

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

25
2017-11-16 03:28



وفقا للصفحة رجل لتحويل: "إن برنامج تحويل هو عضو في مجموعة أدوات ImageMagick (1)." - nedned
انت على حق. لسبب ما اعتقدت أنه جزء من مكتبة مختلفة. وفي كلتا الحالتين ، الرمز الذي قمت بنشره أعلاه هو الطريقة الصحيحة لأتمتة تحويل الدفعات في دليل ما. - Marcin
يمكنك استخدام توسيع bash لتحسين ذلك الأمر مثل: for f in *.png; do convert "$f" "${f/%png/jpg}"; done - evilsoup
فقط تذكر أنه حساس لحالة الأحرف. اسم الكاميرا الخاصة بي كما * .JPG ولم يدرك هذا في المقام الأول. - tsenapathy


الفعلية "png2jpg"الأمر الذي تبحث عنه في الواقع ينقسم إلى أمرين يسمى pngtopnm و cjpeg، وهم جزء من netpbm و libjpeg-progs الحزم ، على التوالي.

png2pnm foo.png | cjpeg > foo.jpeg

7
2017-11-16 05:29





ليرة تركية، والدكتور

لأولئك الذين يريدون فقط أبسط الأوامر:

تحول و احتفظ الملفات الأصلية:

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

تفسير

  • mogrify جزء من يماغيماغيك مجموعة من الأدوات لمعالجة الصور.
    • 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

قم بتحويل جميع ملفات 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

7
2017-10-17 15:02



ربما أفضل إجابة شريطة أن تتخلص من while read جزء (استبداله أو إزالة كل ذلك معا) ... - don_crissti
don_crissti ، ما الخطأ في القراءة؟ - Steven Jeffries
إنها عرضة للخطأ (ما لم تكن متأكدًا بنسبة 100٪ من أنك تتعامل مع أسماء ملفات عاقدة) وبطء (مثل بطيء جدًا جدًا جدًا). - don_crissti
ما هي جودة JPG الافتراضية ، وكيف يمكن الحفاظ على الطوابع الزمنية للملفات؟ - Dan Dascalescu
DanDascalescu ستحافظ الطرق المذكورة أعلاه (ما عدا آخرها) على أسماء الملفات ، ولكنها ستحل محل امتدادها ، لذلك يجب أن تكون الملفات التي تم ختمها زمنيًا على ما يرام (دائماً قم بعمل نسخة واختبار أولاً). وفقًا لـ ImageMagick ، ​​"الافتراضي هو استخدام الجودة المقدرة لصورة الإدخال الخاصة بك إذا كان يمكن تحديدها ، وإلا 92" (imagemagick.org/script/command-line-options.php#qualityيمكن تحديد الجودة بـ -quality <number> حيث <number> من 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 بصراحة ، هذا هو أنيق للنصوص shell. الادعاء بأن الأمر معقد ليس عادلاً. - Max Howell
MaxHowell رجل. رقم هنا سيكون نسخة أنيقة من هذا: for f in ./*.png; do convert "$f" "${f%.*}.jpg"; done. هذا يتجنب غير ضروري تماما ls، grep و sed المكالمات (و echo، ولكن IIRC هذا هو bash builtin ، وبالتالي لن يكون له تأثير ضئيل على الأداء) ، ويتخلص من اثنين من الأنابيب واثنين من subshells ، و ينطوي على أقل الكتابة. انها أكثر قليلا محمولة ، ليس كل إصدارات ls آمنة لتحليل. - evilsoup
evilsoup أقف تصحيح! عمل جيد. - Max Howell


لمعالجة الدفعات:

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

سوف ينتهي بك الأمر مع أسماء الملفات مثل image1.png.jpg رغم ذلك.

هذا سيعمل في bash ، وربما bourne. لا أعلم عن الأصداف الأخرى ، لكن الفرق الوحيد هو على الأرجح تركيب الحلقة.


2
2017-11-16 02:28