Resim sıkıştırma yöntemleri ve JPEG

JPEG'in hikayesi: Daha düşük dosya boyutlarına ulaşmak için resimler nasıl sıkıştırılıyor?

Nedir bu JPEG?

Bugün her ne kadar geniş bant internet hızları yaygınlaşmış olsa da, bundan sadece 10 yıl öncesinde sadece çevirmeli ağ neredeyse herkes için standarttı. Evlerimizde kullandığımız çevirmeli ağ ile ulaşılabilecek maksimum hız saniyede 56 kbit bağlantı hızları ise, web sayfalarının basit öğelerden oluşmasını neredeyse zorunlu kılıyordu. Durum böyle olunca web sayfalarının ilgi çekmesini sağlayacak öğeler, yani resimler en büyük sorundu. Dosya büyüklükleri yüksek olan resimler sayfaların açılmasını neredeyse imkansız hale getirebileceği için farklı yöntemlerle sıkıştırılmış resim türleri son derece önemliydi.

Bu dosya türlerinin başında gelen JPEG bugün halen önemini korumaktadır. Sıkıştırma deyince pek çok kullanıcının aklına ilk olarak Zip gelir. Kullanım olarak tamamen farklı olsa da, temel de Zip ve JPEG'in çok önemli ortak bir yönleri vardır; verileri önce sıkıştırarak daha sonra yeniden oluşturmak. Fakat Zip'in JPEG'den en büyük farkı geri dönüştüreceği sıkıştırılmış dosyalarda veri kaybına tahammül olmamasıdır. Sıkıştırılmış bir Word belgesini tekrar oluşturulduğu sırada içerisindeki en ufak bilgi kaybı bile çok ciddi sorunlara yol açabilir. Bu nedenle Zip sıkıştırma işlemi sırasında önceliği yeniden oluşturulan dosyanın "kayıpsız" olmasına verir.

Her alanda sıkıştırma

Her alanda sıkıştırma
Müzik dosyalarının en popüler sıkıştırma formatı MP3

Bazı dosya tiplerinde sıkıştırma ve yeniden oluşturma süreci sonrasında, ilk ve son dosyanın verileri tamamen aynı olmasa da yani belli oranda kayıp oluşsa da bu durum kabul edilebilir. Çünkü zaten bu tip dosyalarda, işlemden sonra kaybolacak veri, normal bir insanın algı seviyesinde fark edilmeyecek kadar küçük olabilir. Bu bahsettiğimiz dosya tipleri genellikle gözlerimiz ve kulaklarımıza hitap eden veriler içerirler.

Örneğin bilgisayarlarımızda sıkıştırılmamış ses dosyaları WAV olarak saklanır. WAV dosyaları yüksek ve düşük frekanslardaki sesleri de içerdiği için, dosya ebatları oldukça büyüktür. Fakat bugün hemen hepimizin bilgisayarlarındaki ses ve müzik dosyaları WAV formatında değil, MP3 formatında saklanır. MP3 dosyaları WAV'a göre çok daha az yer kaplamasına rağmen, ses kalitesi aynı oranda yüksek değildir. Ama zaten ortalama bir kullanıcının MP3 sıkıştırması esnasında kaybolan sesleri, ortalama bir ses sistemi ile ayırt etmesi veya fark etmesi çok mümkün değildir.

Patent sorunları

Patent sorunları
Video dosyalarında da sıkıştırmanın önemi büyük

Benzer şekilde video dosyaları, görüntü ve sesi bir arada taşıdıkları için sıkıştırılmadıkları taktirde kaplayacakları alan çok büyük olur. Bu yüzden, her biri değişik algoritmalar kullanan, pek çok farklı video sıkıştırma formatı bulunur. Aralarında en ünlüsü ve en yaygını da MPEG-4'tür.

Fakat düşününce her farklı veri türü için (video, ses, resim vs) birden fazla dosya tipi ve dolayısıyla sıkıştırma algoritması olduğunu görmek zor değil. Peki her biri için bu kadar farklı yöntemler kullanmak yerine, standart olabilecek tek bir yöntemin kabul edilip kullanılması daha iyi olmaz mıydı? Kesinlikle olurdu ama bunun önünde iki önemli engel var. Birincisi farklı ihtiyaçlara göre, farklı sıkıştırma yöntemlerinin kendi üstünlükleri bulunuyor. İkinci sebep ise günümüzde artık kimsenin kolay kolay patentini almadan bir yenilik geliştirmemesi. Dolayısıyla bazı durumlarda firmalar için, herhangi bir dosya türünün veya sıkıştırma yönteminin patentini almaktansa, kendi dosya türünü geliştirmek daha ucuza mal olabiliyor. Neyse ki günümüzde pek çok sıkıştırma yönteminin patent sorunu ortadan kalktı fakat zamanında bu sebeplerden ortaya çıkan farklı dosya türleri varlıklarını hala sürdürüyorlar.

Resim dosyaları

Resim dosyaları

Grafik dosyalarında da durum farklı değil. Halen BMP, GIF, JPEG, PNG, TIFF gibi pek çok farklı dosya türü ve kendi özelliklerine göre kullanım özellikleri ve şekilleri var.

Bunların arasında BMP yani Bitmap sıkıştırılmamış tek grafik dosya türüdür. 24-bit'lik bir resimde her bir pikselin bilgileri 3 ayrı bayt ile tutulur. Her bir bayt RGB olarak ifade edilen üç temel rengin yani kırmızı (R), yeşil (G) ve mavi (B) bilgilerini ayrı ayrı saklarlar.

GIF (Graphics Interchange Format = Grafik Değiştirme Biçimi) resimler için sıkıştırma algoritmaların güzel bir örneğidir. Olukça da başarılı sıkıştırma oranı sağlayan GIF'in en büyük sorunu sadece 256 renk bilgisi taşıyabilmesidir. Bir GIF dosyası oluşturulurken bunu sağlayan program, GIF algoritması ile sıkıştırılacak olan görüntünün sadece 256 renkten oluşan paletini çıkartır. Bunu sağlamak için de birbirlerine yakın renk değeri olan pikseller arasında bir tercih yapar ve en uygun görünen rengin bilgisini, benzerleri için de kullanır. Özellikle çok daha fazla renk çeşidi bulunan fotoğraflarda bu önemli bir veri kaybı anlamına gelir.

Ve JPEG...

Ve JPEG...
Resim kalitesi arttıkça, dosya boyutu da artıyor.

JFIF (JPEG File Interchange Format) olarak da ismine rastlayabileceğiniz JPEG ise daha farklı bir sıkıştırma yöntemine sahiptir. 1986 yılında kurulan Joint Photographic Experts Group, "renkli ve gri tonlarındaki resimlerin" sıkıştırılması için bir standart oluşturmayı hedefliyordu. 1992 yılında ortaya konulan standartlar, 1994 yılında resmiyet kazandı.

Kayıpsız ve sıkıştırılmamış Bitmap grafikleri JPEG'e dönüştürmek için öncelikle standart renk paleti olan RGB, YCbCr olarak adlandırılan farklı bir palet türüne dönüştürülür. Özellikle televizyon sinyallerinde kullanılan bu renk paleti, her ne kadar RGB ile benzer renk aralığına sahip olsa da renkleri farklı bir yöntem ile kodlar. Cb ve Cr bileşenleri (kroma olarak da adlandırılı) kırmızı ve mavi renklerin yoğunluğunu ifade ederken, Y bileşeni renklerin parlaklık değerini taşır.

Pozitif ayrımcılık

Pozitif ayrımcılık
Düşük oranda sıkıştırmalar da orijinal ile sıkıştırılmış arasındaki fark az.

RGB değeri taşıyan tek bir pikselin bilgilerini bu renk türüne dönüştürmek için özel bir formül kullanılır. Dönüştürme işlemini hızlandırmak için hesaplamaların bazı kısımları o anda yapılmaz, daha önceden yapılmış hesaplamaların depolandığı veri bankalarından faydalanılır. Bu sayede dönüştürme esnasında performanstan ödün verilmemiş olur.

Bundan sonra ise insan gözünün parlaklık algılama özelliği devreye girer. İnsan gözü düşük ışıkta sadece beyaz ve siyah renkleri tanımlayabilir. İnsan gözünün renklerden önce parlaklığı ayırt edebilmesi nedeniyle JPEG önceliği Cb ve Cr değerlerine değil, Y değerine verir. JPEG formatında resmin boyutlarını küçültmek için piksellerde taşınan bazı değerlerin ortadan kaldırılması gerekmektedir. Bu işlem JPEG formatı dönüştürmesinde üç farklı şekilde gerçekleşebilir. İlk seçenek hiçbir değeri ortadan kaldırmamaktır. İkincisi kroma değerlerini yatay olarak ikiye bölmek ve üçüncüsü ise kroma değerlerini hem yatay, hem dikey olarak ikiye bölmektir. Bu sayede sıkıştırma işlemi esnasında ilk veri kayıpları ortaya çıkmaya başlar.

Ayrık Kosinüs Dönüşümü

Ayrık Kosinüs Dönüşümü
Resimler 8 x 8 ebatlarında piksel bloklarına bölünüyor.

Bir sonraki adımda, resmi oluşturan pikseller 8 x 8 boyutlarında piksel gruplarına ayrılır. Bu ayırma işlemi her renk değeri için ayrı ayrı yapılır. Fakat tüm resimler 8 x 8 oranlarında olmayabilir. Bu yüzden zaman zaman JPEG resimlerin sağ alt köşelerinde piksellerin sıkışmasından meydana gelen bozukluklar gözlenebilir.

Sonraki aşamada bu 8 x 8 ebatlarındaki piksel blokları, Discrete Cosine Transform (DCT) yani Ayrık Kosinüs Dönüşümü adı verilen bir işleme tabi tutulur. Bu aşamada resmin dikey ve yatay orijinal renk değerleri, özel bir formül yardımıyla hesaplanır ve frekanslarının en yüksek ve düşük olduğu noktalar saptanır. Bu işlemin sebebi aslında en yüksek frekanslardaki renklerin tespit edilmesidir. İnsan gözü yüksek frekansları ayırt etmekte zorlandığı için bunları düşürmek ve hatta sıfıra indirmek mümkündür.

Yeniden oluşturma

Yeniden oluşturma
Yüksek sıkıştırma oranları düşük kaliteli resimler oluşturuyor.

Bundan sonra ise en yüksek frekansların değerleri düşürülür veya sıfırlanır. Bunun sonucu olarak 8 x 8 ebatlarındaki piksel bloklarının her birinin ayrı kalite değerleri oluşur. Bundan sonra tüm 8 x 8'lik blokların kalite değerleri özel bir hesaplama ile birbirine yaklaştırılır, bir anlamda kalite değerlerinin ortalaması alınır. Ardından her bir 8 x 8 piksel bloğu Huffman sıkıştırma metoduna tabi tutulur. Bu noktada her 8 x 8'lik piksel bloğu için üç adet 8 x 8'lik matris oluşturulur. 192 bayt veriye denk düşen bu aşamada en çok sıkıştırılmış olan matrisler Cr ve Cb değerlerine ait olan verilerdir.

Bu şekilde sıkıştırılan resim daha hızlı transfer edilir ve görüntüleneceği zaman tüm bu işlemler tersi bir şekilde uygulanır ve sıkıştırılma açılır. Önce Huffman metodu tersine çalışır, Ardından DCT işlemi tersine döndürülür ve sonrasında piksellerin YCrCb verileri eldilmiş olur. Son adımda YCrCb değerleri, ilk yapılan işlemin tersine bu kez RGB'ye dönüştürülür ve karşımıza ilk Bitmap görüntüsü çıkar. Tabi ki JPEG tam kayıpsız bir sıkıştırma metodu olmadığı için karşınıza çıkan görüntü, ilk Bitmap resimle farklılıklar gösterebilir. Fakat mantık kaliteden ödün vererek, dosya boyutunu küçültmek olduğu için bu zaten en baştan göz alınmış bir kayıptır. Pek çok program, JPEG kayıt etme esnasında size yüzde olarak arzu ettiğiniz kalitenin seviyesini sorar. Sizden aldığı bu veriye göre renklerin sıkıştırılma oranını belirler ve yüksek sıkıştırma oranları renk değerlerinde gözle görülür değişimlere yol açabilir.

Okuyucu Yorumları