|
|
|||||||||||||
|
|
Biraz Resim Çalışması
Windows’un açıktan sunduğu bu işlevler çoğunlukla işletim sisteminin kullanması için hazırlanmıştır. Bu yazıda birkaçını inceleyeceğimiz, resimlerle ilgili işlevlerin hemen hepsinin Windows tarafından sıkça kullanıldığını söyleyebiliriz.
Bu yazıda hazırlayacağımız uygulamamız iki resmi belli bir oranda katıştırıp yeni bir resim oluşturuyor. Ek olarak resimler için iki farklı gri tonlama yöntemi uygulanabiliyor ve resimler yatay ve dikey çevrilebiliyor. Ayrıca BMP ve JPG biçimindeki dosyalar okunabiliyor ve çıktı olarak bu türde dosyalar oluşturulabiliyor.
İki resmin iç içe geçirilmesi yani katıştırılması nasıl olur? Aslında bu durum yalnızca renk ve ışıkla ilgilidir. Renkleri kırmızı, mavi ve yeşil ile (RGB) ifade edebildiğimiz bir ortamda mavi ışık şiddetini artırmak, görüntüdeki mavi değerlerinin artması, aynı zamanda diğer renk değerlerinin dolaylı olarak kısmen azalması anlamına gelir.
Ekteki Renk uygulamasını kullanarak renklerin nasıl sayısallaştırıldığını daha iyi anlayabilirsiniz. Göreceğiniz gibi gözle ayırdedebileceğimiz tüm renkler sayısal ortamda bu üç rengin karışımından elde ediliyor. Sonuçta her rengin, bu üç rengin belli oranlardaki karışımından oluştuğunu söylemek mümkündür. Görüntülerin katıştırılması da aslında bununla ilgilidir. Aynı düzlemde karşılıklı her noktası kesiştirilen iki resmin karışımını oluşturmak için karşılık gelen renklerin değerlerinin yukarıdakine benzer şekilde, belli kuvvet oranlarında toplanması gerekir. Aynı kare içinde iki farklı resmi eşit oranda görüntülemek için herbirinin ışık şiddetini azaltıp çakışan renklerin değerlerini toplamak yeterlidir. Bu da aslında ortalamayı almaktan başka bir şey değildir. Tam kesişen iki resmin bir A noktasına karşılık gelen yeni rengi hesaplamak için aşağıdaki yol kullanılır: Renk_A = (Renk1+Renk2) / 2 yani R = (R1 + R2) / 2
function RenkKatistir(renk1,renk2:TColor; oran:byte):TColor;
overload;
Resimleri hatta videoları bundan daha hızlı ve daha farklı şekillerde katıştırmak için çeşitli yollar ve araçlar vardır. DirectX araçlardan biridir. Ayrıca Windows’un içinde hazır bulunan ve yeni sürümlerle birlikte ortaya çıkan yeni APİ işlevleri de sözkonusudur. Açıkçası bu çeşit işler için en doğru yollar burada anlatılanlar değildir. Bu yazı yalnızca okuyucularımızın bu işin nasıl yürüdüğünü kavramalarını sağlamak içindir. Asıl yapılması gerekenleri yeri geldikçe sonraki yazılarımızda inceleyeceğiz. Resim Geçiş uygulamasında çok çeşitli işlevler var. Bunları oluştururken sıkça ihtiyaç duyabileceğiniz yöntemleri göz önünde bulundurup işinize yarayacak kodlar oluşturmaya çalıştık. Ekteki Delphi kodlarında resimlerin yatay ve dikey döndürülmesi, renkli resimlerin gri tonlanması, JPEG ve BMP dosyalarının okunup kaydedilmesi gibi işlevler sağlayan çeşitli yordamlar yer alıyor.
RESİM DOSYALARIYLA ÇALIŞMAK Resim Geçiş’te katıştırma işlemi yapmadan önce, üstteki Resim Seç düğmelerini kullanarak sağ ve sol bölmeye birer resim yüklemek gerekiyor. Yüklenen resimleri TImage nesnelerinin haricinde aynı zamanda hafızada tutmayı tercih ettik. Bunun için görünür olmayan TBitmap nesnelerini kullanmak gerekliydi. Aşağıdaki işlev verilen bir JPEG ya da BMP biteşlem resmini bellekteki bir TBitmap nesnesine yükler. Uses jpeg; ... //JPG ya da BMP resmi yükler. Bunu bir TImage nesnesi için kullanmak istiyorsanız alttaki gibi deneyin. If ResimDosyaYukle(‘c:\dosya.jpg’, image1.picture.bitmap)
then Jpeg dosyaları ile çalışmak için kod sayfasında Uses kısmına “Jpeg” adını eklemeyi unutmayın. Bir resmi dosya olarak kaydetmek istediğinizde ise aşağıdakini kullanabilirsiniz: procedure ResimDosyaKaydet(dosya:string; resim:TBitmap); JPEG ve TBitmap çevriminin Assign ile yapıldığına dikkat edin. Oluşturulan yeni TImage resmini kaydetmek için de şunu deneyin: ResimDosyaKaydet(‘c:\dosya.jpg’, image1.picture.bitmap);
Resim geçiş uygulamasında elde edilen sonuç resmi hafızaya alınabiliyor.
... procedure TAnaPencere.btnPanoyaKopyalaClick(Sender: TObject); Bu kod image1 resmini hafızaya alıyor. Aşağıdaki, uygulamamızda olmayan kod parçası ise hafızadaki bir resmi yüklemektedir. procedure ... Yine Assign kullandık. Panodan okumakla dosyadan okumak arasında pek fark yok.
TImage nesneleri (Delphi’de Additional sayfasından seçilir) yüklenen resimlerin her noktasına ulaşmak için işlevler sağlar. Aslında bu işlevlerin çoğu Windows’taki APİ’leri kullanmaktadır. Resmin yüzeyindeki (Canvas) bir rengi almak için aşağıda gördüğünüz gibi gdi32.dll içindeki GetPixel işlevi kullanılıyor. function TCanvas.GetPixel(X, Y: Integer): TColor; [Windows.pas] Bu haliyle resimlerin her karesini istediğimiz gibi değiştirmemiz de (SetPixel) mümkün olmaktadır. image1.canvas.pixels[100,150]:= clRed; Bu iki satır resim nesnesinin (100,150) ve (101,151) noktalarını kırmızıya boyamaktadır. Resmi döndürmek de benzer şekilde yapılıyor. Ters çevirmek için birbirine karşılık gelen noktaların renk değerlerini değiştirmek yeterli olur. procedure YatayDondur; gecici:=TBitmap.Create; image1.Canvas.Lock; for h:=0 to image1.Height do image1.Assign(gecici); Screen.Cursor:=crDefault; end;
Üç baytlık renk sisteminde (RGB) yalnızca gri ve siyah tonları elde etmek için renkteki tüm değerleri aynı yapmak gerekir. Bu aslında tek bayt ile ifade edilebilecek bir renk değeridir. Renk:= RGB(128,128,128); şeklindeki bir renk griden başkası değildir. Zaten graphics.pas dosyasında yer alan aşağıdaki satır bunu doğruluyor. clGray = TColor($808080); Bu durumda rengimizin sayısal olarak 128 ile (yani $80) ile tek bayt olarak ifade edilmesi mümkündür. Peki bir rengi griye dönüştürme işlemi nasıl olmalıdır? Bunun en basit yolu her noktanın rengindeki baytların ortalamasını almaktır. Yani Ortalama =(R+G+B) / 3 Gri tonlama için çeşitli yöntemler üretilebilir. Bir diğeri özellikle doğa görüntüleri için kullanılabilen, ortalamada yeşilin ağırlıklı olduğu gri tonlama yöntemidir. Yukarıdaki ortalama yönteminde her rengin katılımı 0.33 (1/3) iken bu yöntemde yeşil %60, kırmızı %10, mavi de %30 olarak ortalamaya dahil edilmektedir. Ortalama =(R * 0.1 + G * 0.6 + B * 0.3) / 3 ( R=Red (Kırmızı); G=Green (Yeşil); B=Blue (Mavi) ) İkinci yöntem için Resim Geçiş’in kodlarında yer alan GriTonlama2 yordamını oluşturduk. procedure GriTonlama2(kaynak,nereye:TBitmap);
Aşağıdaki resim için özenle çalıştık. Zar zor da olsa Windowsumuzun böyle bir felaket karşısında ne yapacağını öğrenmiş bulunuyoruz. Sizce verilerin kurtarılması için kayıt düğmesine basıp sabit diske kaydetmeyi sağlayacak kadar boş bellek alanı kalmış mıdır?
DOSYALAR:
Serkan ŞAHİNOĞLU |
||