Bitmapler
Bir bitmap (BMP) temel olarak tanımladığınız şeydir, piksel renklerini temsil eden bir sayı dizisidir. Örneğin bir şey
1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1
Kayıpsız sıkıştırma
Şimdi bir sıkıştırma şeması tanımlayalım. Sıkıştırma düzenimizde, bir çift sayımız olacaktır. Örneğin
3, 1, 1, 0, 7, 1
Şimdi, belirtmek istediğim ilk şey, bu sıkıştırma düzeninin ilk diziyle aynı pikselleri temsil etmesidir. İlk dizide üç 1, ardından tek bir 0 ve ardından yedi 1. Ve burada temsil ettiğimiz şey bu. İki formatlı çoklu pikselleri temsil ettiği için bu format daha kısadır. Bitmap formatı, her piksel için bir sayı kullanmak zorundadır.
Açıkçası bu, bir görüntünün (örneğin sadece bir satır) ve bir sıkıştırma şemasının basitleştirilmiş bir görüntüsüdür. Ancak umarım bu, sıkıştırma düzeninin görüntünün biçimini nasıl değiştirdiğini görmenize olanak sağlar. Bir GIF'in BMP ile olan ilişkisi budur. GIF , bu basit yerine Lempel-Ziv-Welch adlı bir sıkıştırma şeması kullanıyor .
Burada tarif ettiğimiz kayıpsız bir sıkıştırma şemasıdır. Kayıpsız sıkıştırma şemalarındaki bir problem, bazı girdiler için kodlanmış formun orijinalden daha uzun olabileceğidir. Örneğin
1, 0, 1, 0, 1
Kodlama
1, 1, 1, 0, 1, 1, 1, 0, 1, 1
Eh, bu işe yaramazdı. Girişi iki kat daha uzun yaptık.
Başka bir kayıpsız sıkıştırma
Şimdi, farklı bir sıkıştırma şeması düşünelim. Bu resimde, görüntüyü bindirme daireler olarak göstereceğiz. Her daire için bir merkez, bir yarıçap ve bir renk tanımlayacağız.
İlk bitmapimiz olur
5, 5, 1, 3, 0, 0
Bu bizim ilk sıkıştırma yöntemimizle aynı uzunluktadır.
Ve bizim ikinci olabilir
2, 2, 1, 2, 1, 0, 2, 0, 1
Bu, orta öğede ortalanmış üç dairedir (bilgisayar sayısında 2, bilgisayarlarda 0 saymaya başlar). Bir dairenin yarıçapı 2 ve renk 1'i vardır. Sonra, renk 0 ve yarıçapı 1 olan bir daireyi ekleriz. Sonunda, renk 1 ve yarıçapı 0 olan bir daireye sahibiz.
1, 1, 1, 1, 1
1, 0, 0, 0, 0, 1
1, 0, 1, 0, 1
Veya
2, 2, 1, 1, 0, 0, 3, 0, 0
Bu aynı başlangıç çemberidir ancak iki nokta çemberi ile kaplıdır. Adımlar, olur
1, 1, 1, 1, 1
1, 0, 1, 1, 1
1, 0, 1, 0, 1
Her ikisi de ilk kodlanmış versiyondan daha kısa fakat orijinal versiyondan daha uzun.
Neden çevrelerden bahsettiğimi ve aralıklardan bahsetmediğimi merak edebilirsiniz. Asıl sebep, çemberlerin gerçek iki boyutlu görüntülerin kullandıklarına daha yakın olmalarıdır.
Kayıplı sıkıştırma
Ayrıca kayıplı sıkıştırma şemaları konseptine sahibiz. Bu kayıpsız sıkıştırma şemaları orijinal bitmap dizisine geri döndürülebilir. Kayıplı sıkıştırma düzenleri geri dönüşümlü olmayabilir.
Çevreler yöntemimizin kayıplı bir versiyonunu düşünelim. Bu konuda basit bir kural kullanacağız. Yarıçapı 1'den küçük olan daireleri saklamayız. Yani son iki kodlamada bunun yerine
2, 2, 1, 2, 1, 0
ve
2, 2, 1
yine piksellere dönüştürülen
1, 0, 0, 0, 1
ve
1, 1, 1, 1, 1
İlk versiyon orijinalden daha uzun sadece bir element. İkinci versiyon daha kısa. Her ikisi de geçerlidir, bu yüzden algoritma her ikisini de geliştirmekte ve daha kısa olanı seçmekte özgürdür.
Daha kısıtlayıcı kuralları olan görüntüleri daha düşük kalitede olarak tanımlarız.
Görüntülerin üst üste bindirilmiş dairesel şekil koleksiyonları olarak gösterilmesi, Ortak Fotoğraf Uzmanları Grubu veya JPEG formatının çalışma biçimine benzer . Şekilleri dairelerden ziyade elipslerdir, ancak fikir benzerdir. Basit yöntemimizden çok, görüntüleri kodlamak için ayrık kosinüs dönüşümünü kullanıyor .
GIF’in aksine JPEG aslında görüntüyü temsil etmenin farklı bir yoludur. GIF hala pikseldir. Sadece farklı bir şekilde depolanırlar. JPEG şekiller. Bir JPEG görüntülemek için, şekilleri piksellere dönüştürürüz, çünkü ekranlar bu şekilde çalışır. Teoride, bu şekilde çalışmayan bir ekran geliştirebiliriz. Piksel yerine, JPEG formatına daha iyi uyması için şekiller oluşturabilir. Tabii ki, bu ekran bitmap'leri gösteremezdi. Bir BMP veya GIF görüntülemek için JPEG’e dönüştürmemiz gerekir.
Standart bir GIF dönüştürürseniz, 300x300 piksel söylerseniz, JPEG formatına dönüştürürseniz ve kaliteyi düşürürseniz, kullandığı temel şekiller görünür olmalıdır. Çoğu JPEG, daha yüksek çözünürlüklü bir görüntüyle başlayarak bu yapıtları önler.
JPEG'ler iyi ölçeklenir, çünkü piksel yerine şekillerdir. Bu nedenle, 8000x8000 görüntüyle başlarsanız, JPEG'e dönüştürün ve 300x300 görüntü olarak görüntüleyin, kaybedilen ayrıntıların çoğu yine de kaybedilir. 8000x8000 bitmap'i önce 300x300 bitmap'e, ardından JPEG'e dönüştürdüyseniz, sonuçlar genellikle daha düşük kalitede olur.
MPEG
Hareketsiz görüntülerden bahsediyoruz. Moving Picture Experts Group veya MPEG formatında JPEG olarak sıkıştırma aynı tür kullanır, ama aynı zamanda başka bir şey yapar. Video yapmanın basit bir yolu, bir dizi durağan görüntü göndermek olsa da, MPEG aslında bir kare gönderir, ardından bazı kareler, değişiklikleri listeleyen ve bir son kare ile sonlandırır. Çoğu kare önceki kareye benzer olduğundan, değişikliklerin listesi genellikle ikinci bir görüntününkinden daha küçüktür.
Sıra normalde o kadar uzun değil, beş kare diyelim. Ancak, akışın olması gerekenden daha küçük olmasına yardımcı olur.
basitleştirmeler
Çok fazla görmezden geldim. Resimlerim yalnızca iki renge (1 bit) sahip, 8 bitlik görüntünün 256'sı değil ve kesinlikle 32 bitlik bir görüntünün 4,294,967,296'sı değil. 8 bit görüntülerde bile, görüntü için genellikle farklı paletler seçebileceğinizi unutmayın. Dolayısıyla, aynı sekanslara sahip iki adet 8 bit bitmap, farklı görünen (aynı şekil ancak farklı renkler) görünen görüntüleri temsil edebilir.
Resimlerim tek boyutlu, iki boyutlu değil. Çoğu görüntü, dizileri iki boyutlu hale getiren belirli bir satır boyutuna sahip olacaktır.
Gerçek kodlamaları hiç temsil etmeyi denemedim. Kullandığım basit olanlardan çok daha karmaşıklar. Bunu yaptım çünkü bu yazıdaki kodlamaları tanımlamak istedim. Tek bir cevapla Lempel-Ziv'i daha karmaşık Lempel-Ziv-Welch iyileştirmesini daha az açıklayabileceğime ikna olmadım. Ve Fourier'in onları herhangi bir uzunlukta açıklamak için yeterince iyi dönüşümler yaptığını da anlamıyorum.
Bu, gerçek görüntü işlemenin basitleştirilmiş bir sürümüdür. Ancak, didaktik amaçlar için, hala önemli noktalara vararak daha karmaşık gerçeklikten daha kolay anlaşıldığını hissediyorum.