Resim Önizleme Aracı

Basit ama kendinize ait bir Resim Önizleme aracı yapmaya ne dersiniz. Bu ayki konumuzu bir resim önizleme projesiyle pekiştiriyoruz.

Bu dersimizde yine bir örnek program yapalım istedim. Hem örnek yapıp hem de örnekler içinde konu anlatımı şeklinde ilerlemek daha anlaşılır olacaktır diye düşünüyorum.

Yapacağımız bu program içerisinde bazı yeni özelliklere değineceğim. Mesela bir değişkenin tipini (string,integer gibi) nasıl değiştiririz? Bilgisayarımız da bulunan dosyalara hangi componentler ile ulaşabiliriz? Image nesnesi ile resim dosyalarını nasıl gösterebiliriz? Yazmış olduğum bu sorulara ve daha fazlasına bu programda çözüm bulacağız. Ayrıca Copy, ExtractFileName gibi terimlerin ne işe yaradıklarını ve kullanımlarını da bu programda işleyeceğiz. Şimdi dilerseniz yapacağımız programın ne ve nasıl olacağına bir göz atalım;

- Yapacağımız program bir Resim Önizleyici olacak.
- Bilgisayarımız da bulunan dosyalar arasında gezebileceğiz.
- Dosyalardan uzantısı "jpg" veya "bmp" olanları Image nesnesinde önizleyebileceğiz.
- Önizlemeye aldığımız resmin adını ve resim boyutunu(piksel cinsinden) görebileceğiz.

Evet göründüğü üzere basit bir program olacak ama içerisindeki ayrıntılar ile programcılıkta bir adım daha ileriye basacaksınız. Şimdi her zaman yaptığımız gibi programımızın dizaynını ve algoritmasını çıkartalım.

Bunun için öncelikle sizlere birkaç yeni component tanıtmak istiyorum.

ShellTreeView : Bu component sayesinde bilgisayarınızda bulunan dosya dizinlerini görebilir ve içlerinde gezinebilirsiniz.
ShellListView : Bu componenet ile istediğiniz dizinin içeriğinde bulunan dosya ve klasörleri görebilirsiniz.
ShellComboBox : Combobox stilinde olan bir dizin değiştiricidir. Dizinler arasında geçiş kolaylığı sağlamanıza yarar.

Bu componentleri "Component Palette" araç çubuğunuzdaki "Samples" sekmesinde bulabilirsiniz.

Aslında bu işleri yapan ancak Windows'un eski sürümlerindekilere benzediği için tercih etmediğim componentler de bulunmaktadır. Bunlar "Win 3.1" sekmesinde bulunan "FileListBox" ve "DirectoryListBox" gibi araçlardır. Ama dediğim gibi eski Windows araçlarına benzedikleri için tercihimi daha iyi ve kullanışlı görünen componentlerden yana kullanacağım.

Componentlerimize tanıttığımıza göre Algoritmayı oluşturma işlemine geçebiliriz artık;

- Programın asıl amacı bilgisayarımızda bulunan jpg veya bmp uzantılı resim dosyalarını göstermek.
- Bunun için öncelikle bilgisayarımızda bulunan dizinlere (Belgelerim,Bilgisayarım gibi) ulaşmamız gerekli. Bu iş için ShellTreeView componentini kullanacağız.
- Dizinlerde bulunan dosya ve klasörlere ulaşmak içinse ShellListView componentini kullanacağız.
- Dizin geçişlerine yardımcı olması açısından ise ShellComboBox componentinden yararlanacağız.
- Dizin içersinde bulunan resim dosyalarını görüntülemek için Image nesnesini kullanmalıyız.
- Önizleme yaptığımız resmin adını ve boyutlarını gösterebilmemiz açısından ise iki adet Label işimizi görecektir.
- Görsel açıdan Image nesnesini bir Panel içerisine ve Label nesnelerini de Bevel nesnesine yerleştirmek hiç de fena olmayacaktır.
- Peki resmi ne zaman image nesnesine aktaracağız? Tabiiki resim seçildiğinde, yani dosyaları görmemizi sağlayan ShellListView içersindeki herhangi bir dosyaya tıkladığımızda göstermek en doğrusu olacaktır. Bunu da ShellListView'in OnClick olayına uygulamamız gerekecek. Yani tüm kodlarımızı bu özelliğe ait alana yazacağız.

Algoritmamızı çıkardığımıza göre kabataslak ta olsa bir formun üzerine gerekli componentleri yerleştirerek programımızın görünümünü hazırlayalım. Ben formu aşağıdaki gibi düzenledim, sizler daha farklı da yapabilirsiniz.



Şekil-1 Nesnelerimiz formumuza yerleştirdik. Sizler daha farklı biçimlerde de yerleştirebilirsiniz


Formumuza nesnelerimizi yerleştirdik. Öncelikle bu nesnelere anlamlı isimler (name) verdim. Siz de nesnelerinize yaptıkları göreve ait anlamlı bir isim verebilirsiniz.

Şimdi birkaç düzenleme ile dizin ve dosya nesnelerimizi birbirleriyle ilişkili hale getireceğiz.

Yapmamız gerekenleri nesnelerin Object Inspector penceresindeki Properties sekmesinden ayarlayacağız. Öncelikle ShellTreeView e bir kez tıklayıp Object Inspector penceresine bakalım ve buradan properties sekmesine geçelim. Burada ShellListView alanına gelip formumuzda bulunan ShellListView nesnesini seçelim. Sonrasında ise ShellComboBox alanına gelip formumuzda bulunan ShellComboBox nesnesini seçelim. Böylece ShellTreeView nesnemizi diğer yardımcı nesnelerle etkileşimli hale getirmiş olduk.

Bu olayların benzerlerini ShellListView ve ShellComboBox için de yaptığımızda karşımıza birbirleriyle etkileşimli olan üç adet nesne çıkacaktır. Bu sayede biz bir dizine girdiğimizde, girdiğimiz dizinin içeriğini başka bir nesnede görebileceğiz.


Şekil-2 Nesneleri birbirleriyle ilişkilendiriyoruz


ShellListView nesnemizin ViewStyle özelliğini vsSmallicon olarak ayarladım. Çünkü dizin içerisindeki dosyaların görünümünün küçük ikonlar şeklinde görünmesini istiyorum.. Buna benzer bir iki ufak ayardan sonra program dizayn aşamasındayken yapılacak başka bir işlem kalmadı. Şimdi kodlamaya geçebiliriz ;

Öncelikle, dediğim gibi tüm bu işlemleri dosyalarımızın listelendiği nesnemizin OnClick yordamında yapmalıyız. Yani ShellListView'in OnClick olayından yararlanacağız.


If Dosya_listesi.SelCount=1 then 

  Begin



Burada ; Name özelliğine Dosya_Listesi adını verdiğim ShellListView nesnesinin SelCount (seçili öğe sayısı) değerinin 1 olması durumunda işlemlere başlanacağını belirttik. Yani kısacası listeden herhangi bir öğe seçildiğinde işlemlerimizi başlatacağız.


Dosya_Yolu := Dosya_listesi.Folders[Dosya_listesi.Itemindex].PathName;



Dosya Listesinde seçili olan dosyanın "PathName" yani "Dosya Yolu" nu Dosya_Yolu değişkenimize aktarıyoruz. Dosya_Yolu değişkenimiz var bloğunun altında string olarak tanımlanmış olmalıdır.
Şuan dosya yolunu biliyoruz (Mesela > C:ResimResim1.jpg gibi) ve bu dosya yolunu Dosya_Yolu adındaki String değişkende tutuyoruz. Şimdi bir de bize seçili olan dosyanın uzantısı lazım. Çünkü biz bir resim önizleyicisi yapıyoruz ve bunun için de jpg veya bmp uzantılı dosyalar üzerinde işlem yapmalıyız. Diğer dosya türlerini is es geçmeliyiz. Bahsettiğim dosya uzantısını bir çok yoldan bulabiliriz. Mesela bunun en kısa yolu:

ExtractFileExt(Dosya_Yolu); komutudur. Ancak ben uzun yolunu göstereceğim, hem bu esnada copy ve length komutunu kullanmasını da öğrenmiş olacağız.


uzunluk := length(Dosya_Yolu);



Dosya Yolunun karakter uzunluğunu "Uzunluk" adı altındaki integer değişkenimize alıyoruz. Tabii bu Uzunluk adındaki değişkenimizi Var bloğunun altında integer olarak tanımlamış olmamız gerekiyor. Length komutundan da kısaca bahsedecek olursak; bu komutun kullanım şekli Length(String Değer); şeklindedir. Ve String değerin karakter sayısını sayısal bir değer olarak geri döndürür.
Length('Ankara'); komutu geriye 6 değerini döndürecektir.

Dosyamızı seçtik, seçili öğenin Dosya yolunu bulduk ve bulunan yolun karakter sayısını aldık. Şimdi yapmamız gereken ise dosya yolunun sonunda bulunan karakterleri alıp bir değişkene kopyalamak. Bunu yapmalıyız çünkü dosya uzantıları dosya yollarının son karakterlerinde bulunur. Bunun için Copy komutunu kullanacağız. Copy komutundan da kısaca bahsedersek; kullanım şekli Copy(String Değer, Kopyalamaya başlanacak ilk değerin yeri, kopyalanacak karakter sayısı); Örnek verecek olursak Copy('Ankara',2,5); komutu geriye "nkara" string değerini döndürür.

Dosya yolumuzdaki kopyalanacak ilk değerin yerini bulmalıyız ki Copy komutumuzu oradan başlatmalıyız. Bunun için aşağıdaki kodu uyguluyoruz;


uzanti_yeri := uzunluk-2;



Burada uzanti_yeri adındaki integer değişkenimize(Var bloğunun altında tanımlanması gerekli) Dosya yolumuzun uzunluğunu tutan "Uzunluk" adındaki değişkenimizin 2 değer eksini aktardık. Bu şu işimize yarayacak. Örneğin C:ResimResim1.jpg de bulunan bir resim dosyamız var. Uzunluk değişkenimiz bu yolun karakter uzunluğu olan 19 değerini tutacaktır. Ve bu değerin 2 eksiği olan değer ise 17 dir. Yani dosya uzantısının başladığı yerdir.

Artık dosya uzantısının başladığı yeri de biliyoruz. Bu durumda Copy komutunu kullanmamız için gerekli her şey elimizde mevcut durumda bulunuyor.


uzantisi := copy(Dosya_Yolu,uzanti_yeri,3);



değişkenimize aktarıyoruz. Buradaki 3 rakamı dosya uzantımızın 3 haneli olmasından kaynaklanan bir durumdur.

Daha öncede belirttiğim gibi Dosya uzantısı bulmak tek bir komutla yapılabilmektedir. Ancak burada daha uzun bir yoldan gitmek istedim.

Şimdi "uzantisi" adındaki değişkenimizde seçili dosyamızın uzantısı bulunmaktadır. Bizim projedeki amacımız jpg ve bmp uzantılı dosyaları önizlemek olduğu için bu değişkenimizi bir şart cümleciği içinde kullanacağız;


If (uzantisi = 'jpg') or (uzantisi = 'bmp') then

       begin



Eğer bulunan dosya uzantımız "jpg" veya "bmp" ise dosyanın artık bir resim olduğu anlaşılıyor ve resim ile ilgili işlemlere geçiliyor.


imgResim.Picture.LoadFromFile(Dosya_Yolu);



Seçili resmi imgResim adını verdiğimiz Image nesnesine aktarıyoruz. Böylece seçtiğimiz resmin önizlemesini ekranımızda görebileceğiz.


lbl_Resim_Boyutu.Caption := 'Resim Boyutu : ' + InttoStr(imgResim.Picture.Width) + 'x' + InttoStr(imgResim.Picture.Height);



Seçili resmin piksel boyutlarını "lbl_Resim_Boyutu" label imizin göstermesini sağlıyoruz...

Burada dikkat edilmesi gereken birkaç ayrıntı bulunuyor. Bilindiği gibi label nesnesi String bir değişkendir ve string değerler içerebilir. Ancak biz bu programda integer değerler olan resimlerin piksel boyutlarını da Label nesnemizde görmek istiyoruz. Integer bir değişkeni String bir değişkene atamayacağımız için Delphi'nin değişken tipi değiştirme olanaklarından yararlanacağız. Bu tip değiştirme işlemlerinden birkaç örnek göstermek gerekirse;

InttoStr(Integer Değer);
StrtoInt(String Değer);
TimetoStr(Zaman değeri);


Gibi değişken tipi değiştirme komutları mevcuttur. Kodumuz da görüldüğü üzere label nesnemize "+" işaretini kullanmak suretiyle string ve string değişkene çevirdiğimiz integer değerleri ard arda ekledik.


lblResim_Adi.Caption :=  'Resim Adı : ' + ExtractFileName(Dosya_Yolu);



Seçili resmin Dosya Adını "lblResim_Adi" label imizin göstermesini sağlıyoruz. Buradaki ExtractFileName komutu Dosya yolunu belirttiğiniz bir dosyanın adını geri döndürür. Örneğin; ExtractFileName('CersEmlak.exe'); komutu geriye "Emlak.exe" adını döndürecektir.

Evet Resim adını da ekranda gösterdiğimize göre geriye sadece If deyimlerimizi kapatmak kalıyor;


end; // if deyimini bitiriyoruz (önce içteki)

end; // if deyimini bitiriyoruz (sonra dıştaki)




Şekil-3 Programımız çalışırken. Resim seçilmiş ve işlemler programımız tarafından gerçekleştirilmiş vaziyette görünüyor.


Şuan programımız çalışır bir hale geldi ve istediklerimizi yapabiliyor. Bu dersimizde yapmış olduğumuz bu örnek programın kaynak kodlarını aşağıdaki linkten indirebilirsiniz.

http://www.sanalkurs.net/zip/resimonizleme.rar


 RAR ŞİFRESİ: sanalkurs.net

  • Etiketler;
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

eline saglık
teşekkürler...

Yukarı Git