e-Okul İçin Toplu Fotoğraf Düzenleme

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)

3 Beğeni

Hocam bunu yedek bir resimde deneyin, veriyorum:
Önce
sudo apt install imagemagick

convert resim.png -resize 133x171 resimdegisti.jpg

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.

find . -maxdepth 1 -iname "*.jpg" | xargs -L1 -I{} convert -resize 133*171 "{}" _resized/"{}"

Asıl kaynakta birkaç yöntem daha var: command line - How to resize an image through the terminal? - Ask Ubuntu

2 Beğeni

Ö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.

$ identify image.jpg 
image.jpg JPEG 720x482 720x482+0+0 8-bit DirectClass 100KB 0.000u 0:00.009

Örneğimiz için resim boyutlaru 720*482.

Yukarıdan 5px
Aşağıdan 7px
Sağdan 14px
Soldan 3px

kırpmak isteyelim. Kırpma işlemini aşağıdaki komut ile gerçekleştirebilirsiniz.

convert image.jpg -crop 703x470+3+5 output.jpg

Komuttaki sayıların nereden geldiğini de belirtelim.

703 -> Yeni genişliğimiz -> 720 - 14 - 3
470 -> Yeni yüksekliğimiz -> 482 - 5 - 7
3 -> Resmin yeni sol hizası (Soldan kırpmak istediğimiz miktar)
5 -> Resmin yeni üst hizası (Yukarıdan ırpmak istediğimiz miktar)

Son olarak da bu işlemi klasördeki bütün resimlere uygulayalım.

mkdir output && for i in *.jpg; do convert "$i" -crop 703x470+3+5 "output/$i"; done

Not: Bilgisayarım yanımda olmadığı için kodu deneyemedim. Her halükarda dosyalarınızın yedeğini almayı unutmayın.

Kaynak:
Cropping Images using Command Line Tools Only
Execute command on all files in a directory

4 Beğeni

Zaten yüklü sanırım. Yine de yükleme işlemini yapmama gerek var mı?

Yüklüyse tekrar yüklemenize gerek yok. Tekrar yükleseniz de “bu program zaten yüklü” der, gereksiz yere tekrar yüklemez.

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.

*.txt komutu aldığım yerden kalmış. Orada txt dosyaların uzantılarını ifade ediyor. Siz kendiniz için *.jpg yaparak değiştirebilirsiniz.

Not: Yukarıda da txt’yi jpg olarak değiştirdim.

2 Beğeni

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
1 Beğeni

Evet, kırpma ve boyutlandırma yaptı. Ama resmin boyutu 3 kb’a düştü. Bu haliyle yüklemez. :sweat_smile:

sudo apt install converseen

Ş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.

1 Beğeni

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 Beğeni

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.

Yukarıdaki komutları da bu sh dosyasında sırayla çalışacak şekilde nasıl yapabilirim?

Kullanacağın kodları alt alta o dosyaya yazarsın. Veya aralara koyarsın yani şöyle:

komut1; komut2

diye.

  1. soru da yapılabilir bash ile ama tam nasıl yapılır ben bilmiyorum.

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.

1 Beğeni

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.

Kodların açıklaması
convert "$file" -crop 1463x1881+35+100 "$hedef_dizin/${file%.jpg}.bmp";

satırı dönüştürülen dosyayı direk hedef dizine koyar.

convert "$hedef_dizin/${file%.jpg}.bmp" -resize 133x171 "$hedef_dizin/${file%.jpg}.bmp";

dönüştürüldükten sonra hedef dizine koyulan dosyayı yeniden boyutlandırır.

mv "$hedef_dizin/${file%.jpg}.bmp" "$hedef_dizin/$file"; 

satırı hedef dizindeki dosyanın ismini .jpg olarak değiştirir.

1 Beğeni

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.

3 Beğeni

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.