Daha önce bu konuda 2 benzer konu açılmış ama, o konular tam çözüm değil sanırım. Sorunu tam olarak ayrıntılı anlatayım.
Sisteme yükleyebilmek için fotoğraflar
1- 133x171 boyutlarında olacak
2- 20 kb’tan küçük olmayacak
3- 150 kb’tan büyük olmayacak.
Yukarıdaki üç şartı birden sağlamak zorunda. Tek bir resim olsa düzenlemek kolay ama bazen yüzlerce fotoğrafı aynı anda düzenlememiz gerekiyor. Hem de yukarıdaki şartlara göre.
Bunu sağlayabileceğimiz bir yöntem var mı?
(Fikir olması açısından, windowsta öncelikle resimleri topluca Office Picture Manager aracılığıyla 133x171’in katlarında olacak şekilde kenarlardan kırparak toplu düzenleme yapıyordum. Böylece resimleri küçültme yaptığımda çocukların görüntüsünü zayıflatma ya da şişmanlatmaya uğratmıyordu.
Sonra birisi bir program yapmıştı, fotoğrafları 133x171 boyutunda küçültme yapıyordu, bmp yaptığı için de o kadar küçültmeye rağmen boyutu 20 kb altına düşmüyordu.
Sonrasında da komutla hepsini jpg yapıyordu.)
Bu üç düzenlemeyi, üstelik topluca yapabileceğimiz bir yöntem var mı?
Mesela komutla topluca resimlerin kenarlarından kırptırabiliyor muyuz? (Küçültme değil, kırpma)
Bu oluyorsa bunun toplu versiyonunu yapmak kolay. 1-2-3 diye gidiyorsa resimler eğer çok kolay.
Toplu olarak şöyle bir şey varmış ama, YEDEK almadan denemeyin. Bunu o klasörde terminal açarak yapıyorsunuz.
Öncelikle aşağıdaki komut ile imagemagick uygulamasını yükleyiniz.
sudo apt-get install imagemagick
Dizinde bulunan bütün resimlerinin aynı boyutlarda olduğunu varsayıyorum. Aşağıdaki komut ile resimlerden birinin boyutlarını öğreniniz. Aşağıdakine benzer bir çıktı verecektir.
Kırpma işlemi oldu evet. Ama yukarıdaki komut aşağıdaki hatayı verdi.
convert-im6.q16: unable to open image `*.txt': Böyle bir dosya ya da dizin yok @ error/blob.c/OpenBlob/2874.
convert-im6.q16: no images defined `output/*.txt' @ error/convert.c/ConvertImageCommand/3258.
Ayrıca ben sadece kırpma işlemini yapmıştım. Kırpmakla birlikte bir de yeniden boyutlandırmak için (@Karakurt 'un verdiği kodu da ekleyerek) aşağıdaki şeklini kullanabilirsiniz.
mkdir output && for i in *.jpg; do convert "$i" -crop 703x470+3+5 "output/$i"; convert "output/$i" -resize 133x171 "output/$i"; done
Şu komut ile Converseen uygulamasını yükleyip onunla yapmayı deneyebilirsiniz. Toplu olarak kırpma & yeniden boyutlandırma işlemlerini yapabiliyormuş. Arayüzü olan bir uygulama. Kurduktan sonra uygulamalar menüsünden bulup açabilirsiniz.
Yukarıdaki formüller çok hızlı yaptılar ama boyutunu fazla küçülttüler.
Deneme amaçlı kendi resmimi çekip whatsapp ile ileterek resmi bilgisayara aldım. Resmin boyutu 309 kb idi. Ölçüleri 1532x2048 idi. (Sonrasında resmi drive’a yükleyerek orjinal yani 3 mb haliyle de yaptığımda yine aynı durumla karşılaştığım için, aşağıdaki durumun tüm resimlerde geçerli olacağını düşünüyorum.)
convert *.jpg -crop 1463x1881+35+100 kırp.bmp komutu ile resmi bmp olarak kırpıp convert *.bmp -resize 133x171 yeni.bmp komutu ile bmp olarak ölçüye göre boyutlandırdım. Sonra resimleri topluca seçip sağ tıklayıp yeniden adlandır diyerek “Ara ve Değiştir” kısmında “isim ve sonek” seçeneğini seçip .bmp olanları .jpg olarak değiştirdim. Böylece 3 kb’a düşen resim 60 kb olarak kaldı. Bu haliyle yükleyebiliyorum.
Burada 2 soru sormuş olayım:
1- Yukarıdaki komutları da üstteki gibi tek komut içine toplayabilir miyiz? Hatta bunu txt içine yazıp, sh benzeri bir hale getirebilir miyiz? (Ben de böylece hem bunu yapmayı öğrenmiş olurum. Hem de o komut bir klasör içinde kalır, dönüşecek resimleri içine atar, komutu çalıştırır, çeviririm.)
2- convert *.bmp *.jpg ile bmp olanları jpg yaptığımda boyutunu da küçültüyor. Ama ad değiştir diyerek bmp’yi silip yerine jpg yazdığımda boyut değişmiyor. mv komutu ile tek bir resmin adını değiştirdim ama toplu ad değiştirme yapmıyor. Varsa bunu da üst maddedeki komutlara ekleyerek tek tıkla tamamını bitirir hale getirebilir miyiz?
1 e cevap vereyim. Evet yapılabilir. Mousepad açıp onu isim.sh diye kaydedersiniz, sonra terminalde sudo chmod +x isim.sh yazarsınız. Daha sonra buna tıklayınca bu script çalışır.
Bildiğim kadarıyla BMP sıkıştırmasız ve kayıpsız bir dosya biçimi ancak JPG sıkıştırmalı ve kayıplı bir dosya biçimi. JPG’ye dönüştürürken hem sıkıştırma yapılıp hem de veri kaybı yaşanınca dosya boyutunun küçülmesi normal.
Ad değiştirdiğinizde dosyanın türünü değiştirmediğiniz için değişen bir şey olmuyor. Adının sonuna .jpg getirseniz bile içerik BMP olarak kalıyor ve sistem onu BMP olarak algılayıp BMP olarak işlem yapıyor.
Evet, bunu anladım. Peki dosyadaki resimleri topluca sadece adını değiştir diyerek düzenlemenin bir komutu var mı? Mv konutu ile sadece tek bir dosyanın adını değiştirdim. Topluca değiştiremedim.
Komutları buldum, çalıştırdım ve istediğim sonucu da elde ettim. Hatta sh olarak da çalıştırdım. (Böylece sh oluşturmayı da öğrenmiş oldum. Yardımcı olanlara çok teşekkürler.)
convert *.jpg -crop 1463x1881+35+100 kırp.bmp;
convert *.bmp -resize 133x171 yeni.bmp;
for f in *.bmp; do mv -- "$f" "${f%.bmp}.jpg"; done
Fakat böyle olunca tüm resimler aynı klasörde olduğundan, bunu yüzlerce resme uyguladığımızda karışıklığa sebep olur. Bunu biraz daha düzenli hale getirmek istiyorum. Bunun için de 2 sorum var. Bunları da çözünce, daha düzenli olarak hatta sh olarak bile buraya yükleyip bütün idarecilerin kullanımına sunabiliriz.
1- for f in *.bmp; do mv -- "$f" "${f%.bmp}.jpg"; done ile klasördeki tüm resimlerin adını değiştirmeyi başardım. Aynı formülde, 1 klasöründeki bmp resimleri, adını değiştirip 2 klasörüne aktar demek için klasör adlarını nasıl yerleştirmeliyim?
(Bu soruyu for f in *.bmp; do mv -- "$f" "${f%.bmp}.jpg"; done yerine cp 2.yeni_boyut/*.bmp 3.yükle for f in 3.yükle/*.bmp; do mv -- "$f" "${f%.bmp}.jpg"; done) şeklinde bir işlem daha ekleyerek çözdüm az önce. Ama daha kısa bir yolu varsa o da olur.)
2- convert *.jpg -crop 1463x1881+35+100 kırp.bmp dediğimde resimleri kırp-0.bmp, kırp-1.bmp şeklinde adlandırıyor. Ben isimlerinin kendi isimleri olarak kalmasını sağlayabilir miyim? Diğer formüllerde de aynı şekilde.
komutun sonunda kırp.bmp yazdığınız için isimleri kırp olarak yeniden adlandırıyor, fakat bu işlemi *.jpg’ koşulunu sağlayan birden fazla dosya olduğu için kırp-1, kırp-2 diye adlandırıyor. Her biri orjinal adını korusun derseniz convert işlemini for’un içinde yapabilirsiniz.
Sizin kodunuz için bakacak olursak şu şekilde oluyor:
hedef_dizin="hedef";
mkdir $hedef_dizin;
for file in *.jpg;
do
convert "$file" -crop 1463x1881+35+100 "$hedef_dizin/${file%.jpg}.bmp";
convert "$hedef_dizin/${file%.jpg}.bmp" -resize 133x171 "$hedef_dizin/${file%.jpg}.bmp";
mv "$hedef_dizin/${file%.jpg}.bmp" "$hedef_dizin/$file";
done
kaynak_dizin’deki jpg dosyalarını hedef_dizin’e kopyalar ve istenen işlemleri gerçekleştirir.
Not: “.” şu an bulunduğunuz dizin demektir.
Bu kodu bir sh dosyası içerisine yapıştırıp kullanabilirsiniz veya tek satırda yazarak terminalden çalıştırabilirsiniz.
Teşekkürler, biraz daha uzun yoldan formülleri buldum ama bu çok daha kısa ve kolay.
Bunu da inceleyeceğim bu for konusunu daha iyi öğrenmek için.
Başında elle yapmam gereken işlemleri de kodla yazdırmak fikri aklıma geldi. Bunun için @mustifanci hocamla irtibata geçtik. Üzerinde çalışacağız.
Bitince sh olarak yüklerim buraya inşallah.
Komutların çalışması için imagemagick programının kurulu olması şart mı? Yazdığımız sh dosyasını tamamladık ama açıklama ile paylaşayım dedim. Şartsa ona göre bunu da açıklamaya ekleyeceğim.