Merhaba sevgili e-bergi okuyucuları. Sizlere Eylül 2009 sayımızdaki yazımda da bahsettiğim üzere bilgisayarda tüm veriler sayısal ifadeler olarak tutulur. Bu verilere örnek olarak resimleri, müzikleri, metinleri ve -doğaldır ki- sayıları verebiliriz. Bu yazımda sizlere bu verilerden biri olan resimlerin sayısal olarak nasıl ifade edildiğini örnek bir dosya uzantısıyla anlatacağım. Bu dosya uzantısı “.bmp” olacak ve çok başarılı bir dosyalama yöntemi olmasa da resimde gereken bilgileri oldukça anlaşılabilir bir şekilde sakladığı için resimlerin sayısal karşılıklarını açıklama konusunda güzel bir örnek olacak.
Her dosya belirli bir boyuta sahip olan byte dizisidir. Byte’lar da bitlerden oluşur. Bit’lerin alabileceğin iki farklı değer vardır. Bu değerler de genelde tercihen 0 veya 1 olarak yorumlanır. Eğer bu şekilde yorumlanıyorsa bir byte 8 bit’ten oluştuğu için 256 farklı değere sahip olabilir ve dolayısıyla bir dosyayı da bol basamaklı ve kocaman bir sayı olarak düşünebiliriz. Önemli olan bu bol basamaklı sayıyı nasıl yorumladığınızdır. Tabi ki, dosyanın içeriğinden önce direk olarak dosyayı ne dosyası olarak yorumladığınız da önemlidir. Yazıda .bmp uzantılı dosyaların yapısından yani resim dosyalarından bahsedeceğimiz için “uzunca sayımızı” bir resim dosyası olarak düşünelim. Bu durumda az önce söylediğim gibi tek önemli olan şey bu sayının nasıl yorumlandığıdır. Mesela dosyada saklanan sayının değeri 1 ise bunu bir ağaç resmi, 2 ise siyah fonda mor bir çizgi, 4.591.419 ise sizin belirli bir fotoğrafınız olarak yorumlayabilirsiniz ancak sizin de fark ettiğiniz üzere bu yöntem bazı sebeplerden ötürü uygulanamaz ve aslında oldukça saçma. Öncelikle çekilebilecek fotoğrafların sayısı sonsuza yakın olduğu için (Farkındaysanız sonsuz demiyorum; çünkü fiziksel engellerden dolayı birbirinden farklı çekilebilecek bütün olası fotoğraflar sınırlıdır. Bu çok enteresan da olsa doğru. =) ) her birine bir sayı vermek dosya büyüklüğü açısından oldukça verimsiz bir yöntem. En küçük fotoğrafların bile böyle bir sistemde gigabyte’lar, terabyte’lar hatta bunların bile kuvvetleriyle ifade edilmesi gerekebilir. Matematiksel olarak aslında bu sistemi doğal sayıların sonlu bir alt kümesinden tüm farklı resimlere giden birebir bir fonksiyon olarak düşünebiliriz(Yukarıda belirttiğim gibi resimler sonlu sayıda olduğu için böyle bir fonksiyon belirlemek mümkün.) Hem ayrıca bu sistemin bir diğer eksiği ise herkesin kabul edeceği ortak bir sistem olmaması. İşte bu gibi eksikliklerden dolayı bu sistem ne uygulanabilir ne de kabul edilebilir. Verimsizliğine karşın, verdiğim bu örnekten de anlaşılabileceği üzere resimleri sayılarla kolaylıkla ifade edebilirsiniz. Dolayısıyla artık resimlerin sayılarla nasıl ifade edildiğinden ziyade .bmp gibi özel bir resim dosyası yapısından bahsedebilirim.
Bir sistemin yaygın olabilmesi için onu herkesin (en azından çoğunluğun) kabul etmesi gerekmektedir. İşte bu sistemlerden (aslında yapı demek daha doğru olur) biri de .bmp uzantılı dosyaların yapısıdır. Açılımı Bitmap (bit haritası) olan BMP dosyalarının şu ana kadar 5 farklı versiyonu çıkartılmıştır.; ancak eski sistemlerle uyumluluk gibi sorunlarından dolayı bunlardan üçü fazla kullanılmamaktadır. Diğer ikisini ise şimdi açıklayacağım. Dosyanın genel yapısı şu şekildedir: dosyanın başlangıç kısmında BMP dosya başlığı denilen bir bölge vardır. Bu bölge dosya hakkında genel bilgileri içerir. Daha sonra bit haritasının genel bilgilerinin tutulduğu bir anlamda ikinci başlık gelir. Ardından renk paleti gelir; ancak renk paleti, renk adedi yüksek iken dosyada bulunmaz. Son olarak, asıl resmin tutulduğu, bit haritası verisinin bulunduğu bölge gelir ki normal bir BMP dosyasının en büyük kısmını oluşturur. Bu yapı tüm versiyonlarda korunur; değişen tek şey 2. başlığın içeriğidir. İlk başlığın ilk iki byte’ı sihirli sayı denilen bir değere sahiptir. Genelde ASCII karşılığı ‘B’ ve ‘M’ olan iki byte değeridir. Dosyanın bmp dosyası olduğu bilgisini ifade etmesi amacıyla tutulmaktadır. Sonraki 4 byte’ta dosyanın byte cinsinden büyüklük değeri tutulur. Sonraki 4 byte bu dosyayı yaratan programın daha sonra yorumlamak üzere kendi isteğiyle verdiği sayıdır. Tamamen programın ihtiyaçlarına yöneliktir ve genel geçer bir bilgi içermez. İlk başlıktaki son 4 byte ise bit haritasının (asıl resmin) dosyanın başlangıcından kaç byte ileride başladığını, yani göreceli olarak adres değerini, tutan bir sayıdır. Görüldüğü üzere ilk başlık versiyon farkı gözetmeksizin tüm bmp dosyalarında 14 byte’ta tutmaktadır. Şimdi sıra ikinci başlığa geldi. İşte burada iki farklı versiyon için iki farklı başlık yapısını anlatacağım. İkisinde de ortak olarak ilk 4 byte’ta o başlığın büyüklüğü byte cinsinden tutulur ve yine ikisinde de ortak olarak sonraki bilgiler piksel cinsinden önce genişliği sonra yüksekliğidir. Ancak aradaki fark şudur: bunlardan büyük olanında (40 byte’ta tutulan başlıkta) bu değerler 4’er byte’lar ile tutulurken küçük olanda(12 byte’ta tutulan başlıkta) 2’şer byte olarak tutulur. Büyük olandan devam edecek olursak; sonraki 2 byte kullanılan renk düzlemlerinin sayısını tutmaktadır. Sonraki 2 byte piksel başına düşen bit sayısını, diğer bir ifadeyle renk derinliğini tutmaktadır. Genelde 1, 4, 8, 16, 24 ve 32 gibi değerlere sahiptir. Sonraki 4 byte sıkıştırma metoduna karşılık gelen sayıyı tutmaktadır. Ardından gelen 4 byte resmin byte cinsinden büyüklüğünü tutmaktadır (dosya büyüklüğünden farklı olarak bu değer başlıkların tuttuğu boyutu içermez). Akabinde gelen 2 tane 4’er byte’ta resmin yatay ve dikey çözünürlüğü tutulur; yani bir metrede kaç piksel olduğu tutulur. Sonraki 4 byte’ta renk paletinde kaç tane renk olduğu bilgisi tutulur. En son gelen 4 byte’ta ise kullanılan önemli renklerin sayısı tutulur. Şimdi diğer versiyonda kaldığımız yerden devam edebiliriz. Genişlik ve yükseklik bilgisinin ardından bu 12 byte’lık başlığın zaten üçte ikisi bitmiş oluyor. Daha sonra ise tutulan 2’şer byte’ta önce kullanılan renk düzlemlerinin sayısı daha sonra ise piksel başına düşen bit sayısı tutulmaktadır. En önemli iki versiyonun yapısını da anlattığımıza göre sıradaki bloğa geçebiliriz: renk paleti. Renk paletinin tutulduğu blok az önce söylediğim gibi dosyada her zaman bulunmaz. Eğer renk sayısı örneğin 256 gibi küçük bir sayı ise bu 256 sayının renk karşılıkları dosyanın içerisinde tutulmaktadır. Her bir sayının bir renk karşılığı palete yazılır ve program bit haritasının taşıdığı değerleri bu palette tutulan bilgilere göre yorumlar. Renk paletinin byte olarak büyüklüğü renk sayısıyla doğru orantılıdır.
Artık bit haritası verisine geçebiliriz. Bit haritasında resimdeki her bir pikselin renk değeri tutulur. Bit haritasındaki en önemli nokta resmin tutuluş şeklidir. Resim, en alt ve en sol köşesindeki pikselden başlayarak satırlar halinde tutulur. Satırlar halinde tutulması, ardışık byte’larda sağlı sollu pikseller tutuluyor anlamına gelmektedir. Bir satırın sonundaki pikselden sonra ise bir üst satırın en solundaki piksel tutulur; yani bit haritasında veri en alttaki satırdan itibaren yukarıya doğru satırlar halinde paketlenmiştir. Gelelim tek bir pikselin nasıl tutulduğuna. Piksel bazında verinin nasıl tutulduğu irdelemek için öncelikle bir pikselin kaç bit’te tutulduğunu bilmek gerekir. Eğer bir piksel 1 bitte tutuluyorsa, pikselin alabileceği 2 farklı renk değeri var demektir; zaten genelde siyah beyaz resimler bu şekilde tutulur. 4 bit’te tutuluyorsa 16 farklı, 8 bitte tutuluyorsa 256 farklı renk değerine sahip olabilir. Yani n bit’te tutuluyorsa 2 üzeri n tane farklı renk değerine sahip olabilir anlamına gelmektedir. Daha önce bahsettiğim gibi bu sayı 256 gibi veya daha düşük bir sayıysa bunların anlamlarını taşıması için dosyaya bir de renk paleti eklenebilir. Daha yüksek değerlerde, 16 milyon kadar çok renk tutulabileceği için, artık palete sahip olmak dosyanın boyutu açısından çok verimsiz bir yöntem olacaktır. Eğer dosya bir palete sahipse bit haritasındaki her bir bit grubunda o pikselin rengine karşılık gelen sayı değeri tutulur. Paletin olmadığı durumlarda ise tüm renkler 3 ana rengin karışımı olduğu için bu karışımdaki oranların değerleri tutulur. Piksel başına 24 bit örneğini düşünecek olursak kırmızı, yeşil ve mavinin elde etmek istediğimiz renkteki oranları 1’er byte içerisinde 0 ile 255 arasındaki değerler ile tutulur ve tüm renkler bu şekilde ifade edilir. 24 bit resim dosyalarında bir pikselin öncelikle mavi oranı sonra yeşil en son da kırmızı oranı tutulur. Bir piksel 3 byte'a, yani 24 bit’e karşılık gelmektedir. 32 bit olan renklerde ise bu üç elemente ilave olarak alfa eklenir. Bu değer rengin saydamlık değerini tutmaktadır. Bit haritasında mimari açıdan uygulanan ve bilinmesi gereken bir nokta vardır. Her bir satırın adresi 4’ün katlarında başlar. Örneğin; piksel başına 24 bit olan bir resimde eğer bir satırda 3 piksel varsa bir satırın büyüklüğü 9 byte olmaktadır ve 4’ün tam katı değildir. İşte bu gibi durumlarda mimari sebeplerden dolayı 4’ün katına tamamlanana kadar gereksiz birkaç byte her satıra eklenir. Nihayetinde her satırın büyüklüğü byte cinsinden 4’ün tam katıdır ve her satır 4’ün katıyla ifade edilebilen bir adres değerinde tutulur.
Görüldüğü gibi nispeten basit bir yapıya sahip olan resim dosyası uzantısı bmp’nin yapısı bu şekildedir. Her ne kadar anlaşılması kolay olsa da bmp dosyaları diğer birçok resim dosyasından fazla yer tutmaktadır; çünkü içinde gereksiz bazı bilgiler bulunmaktadır. Bu sebeple veri büyüklüğünün önemli olduğu noktalarda pek tercih edilmeyen bir dosyalama yöntemidir. Veri büyüklüğü önemliyse ve siz verinizi olabildiğince küçük yerde saklamak istiyorsanız, veriyi sıkıştırmanız gerekebilir. Bu veri sıkıştırma yöntemlerini anlatacağım bir sonraki sayımızda görüşmek üzere kendinize iyi bakın, bizimle kalın. =)