سؤال

أنا بحاجة إلى اقتصاص عدد من الصور في jpeg تنسيق بمقدار 20 بكسل على الجانب الأيمن بلا خفة على Linux.

لقد تاكدت jpegtran, ، لكنه يحتاج إلى حجم الملف بالبكسل قبل المحاصيل ، ولا أعرف كيفية إنشاء ملف دفعة مع ذلك.

كيف يمكنني قصف 20 بكسل بدون فقدان من الجانب الأيمن من الصور برمجيًا؟

هل كانت مفيدة؟

المحلول

البرمجة النصية الخاصة بي هي صدئة قليلاً ، لذا يرجى عمل نسخة احتياطية من صورك قبل تجربة هذا البرنامج النصي.

#!/bin/bash
FILES=/path/to/*.jpg

for f in $FILES
do
    identify $f | awk '{ split($3, f, "x"); f[1] -= 20; cl = sprintf("jpegtran -crop %dx%d+0+0 %s > new_%s", f[1], f[2], $1, $1); system(cl); }'
done

تشير إلى ملاحظة:

  • اضبط المسار على القيمة الصحيحة
  • هل تحتاج *.jpeg؟
  • identify هو أمر ImageMagick
  • awk سوف الاستيلاء على أبعاد البكسل من identify لاستخدام كمعلمة (مع انخفاض العرض بمقدار 20 بكسل) ل jpegtran لاقتصاص الصورة
  • تم حفظ الصورة الجديدة على أنها new_[old_name].jpg
  • jpegtran قد يعدل منطقة زراعة المحاصيل بحيث يمكن أن تؤدي دون فقدان. تأكد من أن الصور الناتجة هي الحجم الصحيح وليس أكبر قليلاً.

نصائح أخرى

تشبه إلى حد كبير الإجابة المقبولة ، فإن ما يلي سيعمل أيضًا مع أسماء الملفات التي تحتوي على مساحات. ويمكن القول أنه أكثر بساطة ، باستخدام identifyمدمج -format اختيار بدلا من تحليل الإخراج مع awk.

#!/bin/bash

X=0; Y=0   # offset from top left corner

for f in /path/to/*.jpg; do
    read -r W H < <(identify -format '%w %h' "$f") # get width and height
    (( W -= 20 ))                                  # substract 20 from width
    out="${f%%.jpg}-crop-20.jpg"                   # add "-crop-20" to filename
    jpegtran -crop ${W}x$H+$X+$Y "$f" > "$out"     # crop
done
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top