วิธีการหมุนภาพทั้งหมดในไดเรกทอรีด้วย imagemagick?


18

ฉันต้องการหมุนภาพทั้งหมดในไดเรกทอรีที่ตรงกับรูปแบบ

จนถึงตอนนี้ฉันมี:

for file in `ls /tmp/p/DSC*.JPG`; do
  convert $file -rotate 90 file+'_rotated'.JPG
done

แต่นั่นไม่ให้ผลลัพธ์?

คำตอบ:


20

รหัสของคุณค่อนข้างมีปัญหาเล็กน้อย แรกของทั้งหมดที่คุณจะแยกคำสั่ง ls ซึ่งเป็นความคิดที่ดี คุณต้องอ้างถึงตัวแปรตาม$fileที่คุณชี้ให้เห็นและคุณควรอ้างอิงเพื่อไม่ให้มีช่องว่าง คุณกำลังประกาศnumแต่มันไม่เคยใช้ วิธีที่ปลอดภัยกว่าคือ:

find /tmp/p/ -name "DSC*.JPG" | while IFS= read -r file; do
  convert "$file" -rotate 90 "$file"_rotated.JPG
done

สิ่งนี้จะยังคงมีปัญหาหากไฟล์ของคุณมีการขึ้นบรรทัดใหม่ แต่อย่างน้อยจะไม่แตกถ้าเส้นทางของคุณมีช่องว่าง

หากไฟล์ทั้งหมดอยู่ในไดเรกทอรีเดียวกันก็สามารถทำให้ง่ายขึ้นโดยใช้ globbing คุณยังสามารถใช้การขยายพารามิเตอร์เพื่อสร้างfoo_rotated.JPG1แทนfoo.JPG_rotated.JPG:

for file in /tmp/p/DSC*.JPG; do
  convert "$file" -rotate 90 "${file%.JPG}"_rotated.JPG
done

2
original_filename.JPG_rotated.JPG"วิธีการของคุณจะสร้าง การเพิ่ม"${file%.JPG}"_rotated.JPG จะมีความเหมาะสมมากขึ้น ไชโย!
Valentin Bajrami

1
@ val0x00ff อย่างแน่นอน (และฉันได้ตอบคำถามของคุณซึ่งแนะนำว่า) ฉันเพิ่งทำซ้ำสิ่งที่แน่นอน OP กำลังทำการแก้ไขข้อผิดพลาดที่จ้องมองมากขึ้น
terdon

เย็น! ฉันเพิ่งแก้ไขคำสั่งของคุณเล็กน้อย
Valentin Bajrami

11

mogrify -rotate 90 *.jpg One-Liner ที่ดีกว่าสำหรับการหมุนภาพทั้งหมดด้วยimagemagick

mogrify -rotate 90 /tmp/p/DSC*.JPG จะ infact หมุนทั้งหมด.JPGเริ่มต้นด้วยDSCในpไดเรกทอรี

Mogrify (ส่วนหนึ่งของ imagemagick) แตกต่างจากConvertที่มันแก้ไขไฟล์ต้นฉบับ http://www.imagemagick.org/script/mogrify.php


11

วิธีการง่ายๆที่ใช้ PE (การขยายพารามิเตอร์) คือ

for f in /tmp/p/DSC*.JPG
do
  convert -rotate 90 "$f" "${f%.JPG}"_converted.JPG
done

1
ควรสังเกตว่าไม่มีอะไรbashเฉพาะในนั้นมันเป็นไวยากรณ์ POSIX sh มาตรฐานอย่างสมบูรณ์
Stéphane Chazelas

6

อย่าแยกวิเคราะห์lsและlsไม่จำเป็นต้องใช้ที่นี่ นอกจากนี้คุณควรอ้างอิงตัวแปรของคุณในกรณีที่มีช่องว่าง

for file in *.JPG; do
  convert -rotate 90 "$file" rotated_"$file"
done

พื้นที่ ...หรือแท็บหรือขึ้นบรรทัดใหม่หรือเครื่องหมายดอกจันหรือเครื่องหมายคำถามหรือวงเล็บเหลี่ยม ...
Stéphane Chazelas

6

ไม่ใช่วิธีแก้ปัญหาทางจินตนาการ แต่เป็น

sips -r 90 *.JPG

จะหมุนภาพทั้งหมดที่ลงท้ายด้วย. JPG 90 องศา มันเป็นหนึ่งซับที่ดี


1
fwiw สิ่งนี้จะเขียนทับภาพต้นฉบับ
don_crissti


0

คุณสามารถคัดลอก / วางรหัสนี้ในอูบุนตูและบันทึกเป็น "rotate.sh"

#!/bin/bash -e

CUR_DIR=`pwd`
cd "${1}"

for file in *.jpg; do
    convert "${file}" -rotate 90 "${file}";
done

cd CUR_DIR

หลังจากบันทึกไฟล์นี้ให้รันจากเทอร์มินัลโดยใช้ ./rotate.sh folder_containing_images

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.