JPEG formatı nasıl çalışır?

JPEG görüntüler dijital yaşamımızın her yerinde mevcuttur, ancak bu farkındalık maskesinin arkasında, insan gözünün algılayamayacağı ayrıntıları ortadan kaldıran algoritmalar vardır. Sonuç, en küçük dosya boyutunda en yüksek görsel kalitedir; ancak bunların hepsi tam olarak nasıl çalışıyor? Bakalım gözlerimiz tam olarak neyi göremiyor!

JPEG formatı nasıl çalışır?

Bir arkadaşınıza fotoğraf gönderme ve hangi cihazı, tarayıcıyı veya işletim sistemini kullandığı konusunda endişelenmeme yeteneğini kabul etmek kolaydır - ancak durum her zaman böyle değildi. 1980'lerin başlarında bilgisayarlar dijital görüntüleri saklayıp görüntüleyebiliyordu ancak bunu yapmanın en iyi yolu konusunda birbiriyle yarışan pek çok fikir vardı. Bir bilgisayardan diğerine bir görüntü gönderip işe yarayacağını umamazsınız.

Bu sorunu çözmek için 1986 yılında dünyanın dört bir yanından uzmanlardan oluşan bir komite toplandı.Ortak Fotoğraf Uzmanları Grubu» (Ortak Fotoğraf Uzmanları Grubu, JPEG), merkezi İsviçre'nin Cenevre kentinde bulunan iki uluslararası standart kuruluşu olan Uluslararası Standardizasyon Örgütü (ISO) ve Uluslararası Elektroteknik Komisyonu (IEC) arasındaki ortak çabayla kuruldu.

JPEG adı verilen bir grup insan 1992 yılında JPEG dijital görüntü sıkıştırma standardını oluşturdu. İnterneti kullanan herkes muhtemelen JPEG kodlu görüntülerle karşılaşmıştır. Bu, görüntüleri kodlamanın, göndermenin ve saklamanın en yaygın yoludur. Web sayfalarından e-postaya ve sosyal medyaya kadar JPEG, günde milyarlarca kez, yani neredeyse her çevrimiçi görseli görüntülediğimizde veya gönderdiğimizde kullanılır. JPEG olmasaydı web daha az renkli, daha yavaş olurdu ve muhtemelen daha az kedi resmi olurdu!

Bu makale bir JPEG görüntüsünün kodunun nasıl çözüleceğiyle ilgilidir. Başka bir deyişle, bilgisayarda depolanan sıkıştırılmış verilerin ekranda görünen bir görüntüye dönüştürülmesi için gerekenler. Bu, yalnızca her gün kullandığımız teknolojiyi anlamak açısından önemli olduğu için değil, aynı zamanda sıkıştırma seviyelerinin kilidini açarak algı ve görme hakkında ve gözlerimizin hangi ayrıntılara en duyarlı olduğu hakkında daha fazla şey öğrendiğimiz için de bilinmeye değerdir.

Ayrıca görüntülerle bu şekilde oynamak çok ilginç.

JPEG formatı nasıl çalışır?

JPEG'in içine bakmak

Bilgisayarda her şey bir ikili sayı dizisi olarak depolanır. Tipik olarak bu bitler, sıfırlar ve birler, baytları oluşturmak için sekizli gruplar halinde gruplandırılır. Bir bilgisayarda bir JPEG görüntüsünü açtığınızda, bir şeyin (tarayıcı, işletim sistemi, başka bir şey) baytların kodunu çözmesi ve orijinal görüntüyü görüntülenebilecek bir renk listesi olarak geri yüklemesi gerekir.

Eğer bu tatlıyı indirirsen bir kedinin fotoğrafı ve onu bir metin düzenleyicide açtığınızda, bir sürü tutarsız karakter göreceksiniz.

JPEG formatı nasıl çalışır?
Burada dosyanın içeriğini incelemek için Notepad++ kullanıyorum, çünkü Windows'taki Notepad gibi normal metin editörleri ikili dosyayı kaydettikten sonra bozacak ve artık JPEG formatını karşılamayacak.

Kelime işlemcide bir görüntüyü açmak, bilgisayarın kafasını karıştırır, tıpkı gözlerinizi ovuşturduğunuzda beyninizin kafasını karıştırıp renkli noktalar görmeye başlamanız gibi!

Gördüğünüz bu noktalar şu şekilde bilinir: fosfenlerve zihin tarafından üretilen bir ışık uyarısının veya halüsinasyonun sonucu değildir. Bunlar beyninizin optik sinirlerdeki herhangi bir elektrik sinyalinin ışık hakkında bilgi ilettiğini düşünmesi nedeniyle ortaya çıkar. Beynin bu varsayımları yapması gerekiyor çünkü bir sinyalin ses mi, görüntü mü yoksa başka bir şey mi olduğunu bilmenin bir yolu yok. Vücuttaki tüm sinirler tamamen aynı elektriksel uyarıları iletir. Gözlerinize baskı uygulayarak görsel olmayan sinyaller gönderirsiniz, ancak beyninizin - bu durumda yanlış - görsel bir şey olarak yorumladığı göz reseptörlerini etkinleştirirsiniz. Kelimenin tam anlamıyla baskıyı görebilirsiniz!

Bilgisayarların beyne ne kadar benzediğini düşünmek komik ama aynı zamanda, ister vücutta sinirler aracılığıyla taşınsın, ister bilgisayarda depolansın, verilerin anlamının ne kadarının yoruma bağlı olduğunu göstermek için de yararlı bir benzetme. Tüm ikili veriler, her türlü bilgiyi aktarabilen temel bileşenler olan 0 ve 1'lerden oluşur. Bilgisayarınız genellikle dosya uzantıları gibi ipuçlarını kullanarak bunları nasıl yorumlayacağını çözer. Şimdi bunları metin olarak yorumlamaya zorluyoruz çünkü metin editörünün beklediği şey budur.

JPEG kodunun nasıl çözüleceğini anlamak için orijinal sinyallerin kendisini, yani ikili verileri görmemiz gerekir. Bu, onaltılık bir düzenleyici kullanılarak veya doğrudan orijinal makale web sayfası! Yanında, metin alanında tüm baytlarının (başlık hariç) ondalık biçimde sunulduğu bir resim vardır. Bunları değiştirebilirsiniz; komut dosyası yeniden kodlanacak ve anında yeni bir görüntü oluşturacaktır.

JPEG formatı nasıl çalışır?

Sadece bu düzenleyiciyle oynayarak çok şey öğrenebilirsiniz. Örneğin piksellerin hangi sırayla saklandığını söyleyebilir misiniz?

Bu örnekte tuhaf olan şey, bazı sayıları değiştirmenin görüntüyü hiç etkilememesi, ancak örneğin ilk satırdaki 17 sayısını 0 ile değiştirirseniz fotoğraf tamamen bozulacaktır!

JPEG formatı nasıl çalışır?

7 satırındaki 1988'nin 254 sayısıyla değiştirilmesi gibi diğer değişiklikler, yalnızca sonraki piksellerin rengini değiştirir.

JPEG formatı nasıl çalışır?

Belki de en tuhafı bazı sayıların görüntünün sadece rengini değil şeklini de değiştirmesidir. 70. satırdaki 12'i 2 olarak değiştirin ve ne demek istediğimi anlamak için görselin üst satırına bakın.

JPEG formatı nasıl çalışır?

Ve hangi JPEG görüntüsünü kullanırsanız kullanın, baytları düzenlerken her zaman bu gizemli satranç desenlerini bulacaksınız.

Düzenleyiciyle oynarken, bir fotoğrafın bu baytlardan nasıl yeniden oluşturulduğunu anlamak zordur, çünkü JPEG sıkıştırması, düzeyler halinde sırayla uygulanan üç farklı teknolojiden oluşur. Gördüğümüz gizemli davranışı ortaya çıkarmak için her birini ayrı ayrı inceleyeceğiz.

Üç düzeyde JPEG sıkıştırması:

  1. Renk alt örneklemesi.
  2. Ayrık kosinüs dönüşümü ve örnekleme.
  3. Çalıştırma uzunluğu kodlaması, delta и Huffman

Sıkıştırmanın büyüklüğü hakkında size bir fikir vermek için yukarıdaki görüntünün 79 sayıyı veya yaklaşık 819 KB'yi temsil ettiğini unutmayın. Sıkıştırmadan saklarsak, her pikselin kırmızı, yeşil ve mavi bileşenler için üç sayıya ihtiyacı olacaktır. Bu, 79 rakamına, yani yakl. 917 KB. JPEG sıkıştırması sonucunda son dosya 700 kattan fazla küçültüldü!

Aslında bu görüntü çok daha fazla sıkıştırılabilir. Aşağıda iki resim yan yana verilmiştir - sağdaki fotoğraf 16 KB'ye sıkıştırılmıştır, yani sıkıştırılmamış versiyondan 57 kat daha küçüktür!

JPEG formatı nasıl çalışır?

Yakından bakarsanız bu görüntülerin aynı olmadığını göreceksiniz. Her ikisi de JPEG sıkıştırmalı görüntülerdir, ancak sağdakinin hacmi çok daha küçüktür. Ayrıca biraz daha kötü görünüyor (arka plandaki renkli karelere bakın). Bu nedenle JPEG'e kayıplı sıkıştırma da denir; Sıkıştırma işlemi sırasında görüntü değişir ve bazı ayrıntılar kaybolur.

1. Renk alt örneklemesi

Burada yalnızca ilk düzeyde sıkıştırmanın uygulandığı bir görüntü yer almaktadır.

JPEG formatı nasıl çalışır?
(Etkileşimli versiyon - içinde orijinal nesne). Bir sayıyı kaldırmak tüm renkleri yok eder. Ancak tam olarak altı sayının kaldırılmasının görüntü üzerinde neredeyse hiçbir etkisi olmaz.

Artık sayıların şifresini çözmek biraz daha kolay. Bu, her baytın tam olarak bir piksel değiştirdiği, ancak aynı zamanda zaten sıkıştırılmamış görüntünün yarısı kadar olan (bu küçültülmüş boyutta yaklaşık 300 KB yer kaplayan) neredeyse basit bir renk listesidir. Nedenini tahmin edebilir misin?

Bu sayıların standart kırmızı, yeşil ve mavi bileşenleri temsil etmediğini görebilirsiniz, çünkü tüm sayıları sıfırlarla değiştirirsek yeşil bir görüntü elde ederiz (beyaz yerine).

JPEG formatı nasıl çalışır?

Bunun nedeni bu baytların Y'yi (parlaklık) temsil etmesidir.

JPEG formatı nasıl çalışır?

Cb (göreceli mavilik),

JPEG formatı nasıl çalışır?

ve Cr (göreceli kızarıklık) resimleri.

JPEG formatı nasıl çalışır?

Neden RGB kullanmıyorsunuz? Sonuçta çoğu modern ekran bu şekilde çalışır. Monitörünüz kırmızı, yeşil ve mavi de dahil olmak üzere her rengi, her piksel için farklı yoğunluklarda görüntüleyebilir. Beyaz, üçünün de tam parlaklıkta açılmasıyla, siyah ise kapatılarak elde edilir.

JPEG formatı nasıl çalışır?

Bu aynı zamanda insan gözünün çalışma şekline de çok benzer. Gözlerimizdeki renk reseptörlerine "" denir.konilerve her biri kırmızı, yeşil veya mavi renklere daha duyarlı olan üç türe ayrılır [S-tipi koniler menekşe-mavi renkte hassastır (İngiliz Kısa - kısa dalga spektrumundan S), M -tipi - spektrumun yeşil-sarı (İngiliz Orta'dan M - orta dalga) ve L tipi - sarı-kırmızı (İngiliz Uzun - uzun dalgadan L) kısımlarında. Bu üç tip koninin (ve spektrumun zümrüt yeşili kısmında hassas olan çubukların) varlığı kişiye renkli görme kazandırır. / yaklaşık. çeviri.] sopaGözlerimizdeki başka bir fotoreseptör türü olan fotoreseptör, parlaklıktaki değişiklikleri tespit etme yeteneğine sahiptir ancak renge karşı çok daha duyarlıdır. Gözlerimizde yaklaşık 120 milyon çubuk ve yalnızca 6 milyon koni bulunmaktadır.

Bu nedenle gözlerimiz parlaklıktaki değişiklikleri, renkteki değişikliklere göre çok daha iyi tespit eder. Rengi parlaklıktan ayırırsanız, biraz rengi kaldırabilirsiniz ve kimse bir şey fark etmez. Renk alt örneklemesi, bir görüntünün renk bileşenlerini parlaklık bileşenlerinden daha düşük bir çözünürlükte temsil etme işlemidir. Yukarıdaki örnekte, her piksel tam olarak bir Y bileşenine sahiptir ve dört pikselden oluşan her ayrı grup tam olarak bir Cb ve bir Cr bileşenine sahiptir. Bu nedenle görüntü orijinaline göre dört kat daha az renk bilgisi içerir.

YCbCr renk alanı yalnızca JPEG'de kullanılmaz. İlk olarak 1938'de televizyon programları için icat edildi. Herkesin renkli TV'si yoktur, bu nedenle renk ve parlaklığın ayrılması herkesin aynı sinyali almasına olanak tanıdı ve renksiz TV'ler yalnızca parlaklık bileşenini kullandı.

Yani editörden bir sayıyı kaldırmak tüm renkleri tamamen mahveder. Bileşenler Y Y Y Y Cb Cr biçiminde depolanır (aslında bu sırada olması gerekmez; saklama sırası dosya başlığında belirtilir). İlk sayıyı kaldırmak Cb'nin ilk değerinin Y, Cr'nin Cb olarak algılanmasına neden olacak ve genel olarak resmin tüm renklerini değiştiren bir domino etkisi yaratacaksınız.

JPEG spesifikasyonu sizi YCbCr kullanmaya zorlamaz. Ancak çoğu dosya bunu kullanır çünkü RGB'den daha iyi altörneklenmiş görüntüler üretir. Ama bunun için benim sözüme inanmak zorunda değilsin. Aşağıdaki tabloda her bir bileşenin alt örneklemesinin hem RGB hem de YCbCr'de nasıl görüneceğini kendiniz görün.

JPEG formatı nasıl çalışır?
(Etkileşimli versiyon - içinde orijinal nesne).

Mavinin ortadan kaldırılması, kırmızı veya yeşilin kaldırılması kadar belirgin değildir. Bunun nedeni gözlerinizdeki altı milyon koninin yaklaşık %64'ünün kırmızıya, %32'sinin yeşile ve %2'sinin maviye duyarlı olmasıdır.

Y bileşeninin alt örneklemesi (sol altta) en iyi şekilde görülmektedir. Ufacık bir değişiklik bile fark ediliyor.

Bir görüntüyü RGB'den YCbCr'ye dönüştürmek dosya boyutunu küçültmez ancak kaldırılabilecek daha az görünür ayrıntıların bulunmasını kolaylaştırır. İkinci aşamada kayıplı sıkıştırma meydana gelir. Verilerin daha sıkıştırılabilir bir biçimde sunulması fikrine dayanmaktadır.

2. Ayrık kosinüs dönüşümü ve örnekleme

Bu sıkıştırma düzeyi çoğunlukla JPEG'in özüdür. Renkleri YCbCr'ye dönüştürdükten sonra bileşenler tek tek sıkıştırılır, böylece yalnızca Y bileşenine odaklanabiliriz.Ve işte bu katmanı uyguladıktan sonra Y bileşeni baytları nasıl görünüyor.

JPEG formatı nasıl çalışır?
(Etkileşimli versiyon - içinde orijinal nesne). Etkileşimli versiyonda, bir piksele tıklamak düzenleyiciyi onu temsil eden satıra kaydırır. Sondaki sayıları çıkarmayı veya belirli bir sayıya birkaç sıfır eklemeyi deneyin.

İlk bakışta çok kötü bir sıkıştırma gibi görünüyor. Bir görüntüde 100 piksel vardır ve bunların parlaklığını (Y bileşenleri) temsil etmek için 000 sayı gerekir; bu, hiçbir şeyin sıkıştırılmamasından daha kötüdür!

Ancak bu sayıların çoğunun sıfır olduğunu unutmayın. Üstelik satır sonlarında bulunan sıfırların tümü görüntüyü değiştirmeden kaldırılabiliyor. Yaklaşık 26 sayı kaldı ve bu neredeyse 000 kat daha az!

Bu seviye satranç kalıplarının sırrını içerir. Gördüğümüz diğer efektlerin aksine bu desenlerin görünümü bir aksaklık değil. Bunlar tüm görüntünün yapı taşlarıdır. Düzenleyicinin her satırı, 64 benzersiz modelin yoğunluğuna karşılık gelen tam olarak 64 sayı ve ayrık kosinüs dönüşümü (DCT) katsayıları içerir.

Bu modeller kosinüs grafiğine göre oluşturulur. İşte bunlardan bazıları şöyle görünüyor:

JPEG formatı nasıl çalışır?
8 oran üzerinden 64

Aşağıda 64 desenin tamamını gösteren bir resim bulunmaktadır.

JPEG formatı nasıl çalışır?
(Etkileşimli versiyon - içinde orijinal nesne).

Bu desenler 8x8 görsellerin temelini oluşturdukları için özellikle önemlidir. Doğrusal cebire aşina değilseniz, bu, bu 8 desenden herhangi bir 8x64 görüntünün oluşturulabileceği anlamına gelir. DCT, görüntülerin 8x8 bloklara bölünmesi ve her bloğun bu 64 katsayıdan oluşan bir kombinasyona dönüştürülmesi işlemidir.

Herhangi bir görüntünün 64 spesifik desenden oluşabilmesi sihir gibi görünüyor. Ancak bu, Dünya üzerindeki herhangi bir yerin iki sayıyla tanımlanabileceğini söylemekle aynı şeydir: enlem ve boylam [yarımküreleri gösterir / yaklaşık. çeviri.] Genellikle Dünya'nın yüzeyinin iki boyutlu olduğunu düşünürüz, bu nedenle yalnızca iki sayıya ihtiyacımız vardır. 8x8'lik bir görüntünün 64 boyutu vardır, dolayısıyla 64 sayıya ihtiyacımız var.

Bunun sıkıştırma açısından bize nasıl yardımcı olduğu henüz belli değil. 64x8'lik bir görüntüyü temsil etmek için 8 sayıya ihtiyacımız varsa, bu neden yalnızca 64 parlaklık bileşenini depolamaktan daha iyi olsun ki? Bunu, üç RGB sayısını üç YCbCr sayısına dönüştürmemizle aynı nedenle yapıyoruz: Bu, ince ayrıntıları kaldırmamıza olanak tanıyor.

JPEG, DCT'yi 8x8 bloklara uyguladığı için bu aşamada tam olarak hangi detayın kaldırıldığını görmek zordur. Ancak kimse bunu resmin tamamına uygulamamızı yasaklamıyor. Resmin tamamına uygulanan Y bileşeni için DCT şu şekilde görünür:

JPEG formatı nasıl çalışır?

Fotoğrafta neredeyse hiçbir fark edilebilir değişiklik yapılmadan 60'den fazla sayı sondan kaldırılabilir.

JPEG formatı nasıl çalışır?

Ancak ilk beş rakamı sıfırlarsak farkın açıkça ortaya çıkacağını unutmayın.

JPEG formatı nasıl çalışır?

Başlangıçtaki sayılar, gözlerimizin en iyi algıladığı görüntüdeki düşük frekanslı değişiklikleri temsil eder. Sona doğru sayılar, yüksek frekanslarda fark edilmesi daha zor olan değişiklikleri gösterir. "Gözün göremediğini görmek" için ilk 5000 rakamı sıfırlayarak bu yüksek frekanslı ayrıntıları izole edebiliriz.

JPEG formatı nasıl çalışır?

Görüntünün pikselden piksele en büyük değişimin meydana geldiği tüm alanlarını görüyoruz. Kedinin gözleri, bıyıkları, havlu battaniyesi ve sol alt köşedeki gölgeler göze çarpıyor. İlk 10 rakamı sıfırlayarak daha da ileri gidebilirsiniz:

JPEG formatı nasıl çalışır?

20 000:

JPEG formatı nasıl çalışır?

40 000:

JPEG formatı nasıl çalışır?

60 000:

JPEG formatı nasıl çalışır?

Bu yüksek frekanslı ayrıntılar, sıkıştırma aşamasında JPEG tarafından kaldırılır. Renklerin DCT katsayılarına dönüştürülmesinde herhangi bir kayıp yoktur. Kayıp, yüksek frekanslı veya sıfıra yakın değerlerin çıkarıldığı örnekleme adımında meydana gelir. JPEG kaydetme kalitesini düşürdüğünüzde program, kaldırılan değer sayısı eşiğini artırır, bu da dosya boyutunu azaltır ancak resmin daha pikselli olmasını sağlar. Bu yüzden ilk bölümdeki 57 kat daha küçük olan görüntü bu şekilde görünüyordu. Her 8x8 blok, daha yüksek kaliteli versiyona kıyasla çok daha az DCT katsayısıyla temsil ediliyordu.

Görüntülerin kademeli olarak akışı gibi harika bir etki yaratabilirsiniz. Giderek daha fazla katsayı indirildikçe daha da ayrıntılı hale gelen bulanık bir resim görüntüleyebilirsiniz.

İşte sırf eğlence olsun diye, sadece 24 rakamı kullanarak elde edeceğiniz şey:

JPEG formatı nasıl çalışır?

Veya sadece 5000:

JPEG formatı nasıl çalışır?

Çok bulanık ama bir şekilde tanınabiliyor!

3. Çalıştırma uzunluğu kodlaması, delta ve Huffman

Şu ana kadar sıkıştırmanın tüm aşamaları kayıplıydı. Son aşama ise tam tersine kayıpsız ilerliyor. Bilgileri silmez ancak dosya boyutunu önemli ölçüde azaltır.

Bilgileri çöpe atmadan bir şeyi nasıl sıkıştırabilirsiniz? 700 x 437 boyutunda basit bir siyah dikdörtgeni nasıl tanımlayacağımızı hayal edin.

JPEG bunun için 5000 rakamı kullanıyor ancak çok daha iyi sonuçlar elde edilebilir. Böyle bir görüntüyü mümkün olduğunca az baytla tanımlayacak bir kodlama şeması hayal edebiliyor musunuz?

Ortaya çıkarabildiğim minimum şema dört kullanıyor: üçü bir rengi temsil ediyor ve dördüncüsü o rengin kaç piksele sahip olduğunu gösteriyor. Tekrarlanan değerlerin bu yoğunlaştırılmış şekilde temsil edilmesi fikrine çalışma uzunluğu kodlaması denir. Kayıpsızdır çünkü kodlanmış verileri orijinal haline geri döndürebiliriz.

Siyah dikdörtgenli bir JPEG dosyası 4 bayttan çok daha büyüktür; DCT düzeyinde sıkıştırmanın 8x8 piksel bloklara uygulandığını unutmayın. Bu nedenle en azından her 64 piksel için bir DCT katsayısına ihtiyacımız var. Buna ihtiyacımız var çünkü bir DCT katsayısını ve ardından gelen 63 sıfırı saklamak yerine, sayı uzunluğu kodlaması bir sayıyı saklamamıza ve "diğerlerinin hepsinin sıfır olduğunu" belirtmemize olanak tanıyor.

Delta kodlama, her baytın mutlak bir değerden ziyade bazı değerlerden farkı içerdiği bir tekniktir. Bu nedenle, belirli baytların düzenlenmesi diğer tüm piksellerin rengini değiştirir. Örneğin, depolamak yerine

12 13 14 14 14 13 13 14

12 ile başlayabilir ve ardından bir sonraki sayıyı elde etmek için ne kadar eklememiz veya çıkarmamız gerektiğini basitçe belirtebiliriz. Delta kodlamadaki bu sıra şu şekli alır:

12 1 1 0 0 -1 0 1

Dönüştürülen veriler orijinal verilerden daha küçük değildir ancak sıkıştırılması daha kolaydır. Çalışma uzunluğu kodlamasından önce delta kodlamasının uygulanması, kayıpsız sıkıştırmaya devam ederken çok yardımcı olabilir.

Delta kodlama, 8x8 blokların dışında kullanılan birkaç teknikten biridir. 64 DCT katsayısından biri basit bir sabit dalga fonksiyonudur (düz renk). Luma bileşenleri için her bloğun ortalama parlaklığını veya Cb bileşenleri için ortalama maviliği vb. temsil eder. Her DCT bloğunun ilk değerine DC değeri denir ve her DC değeri öncekilere göre delta olarak kodlanır. Bu nedenle ilk bloğun parlaklığının değiştirilmesi tüm blokları etkileyecektir.

Son gizem hala ortada: Tekili değiştirmek nasıl olur da resmin tamamını tamamen mahveder? Şu ana kadar sıkıştırma seviyeleri bu tür özelliklere sahip değildi. Cevap JPEG başlığında yatıyor. İlk 500 bayt görüntüyle ilgili meta verileri (genişlik, yükseklik vb.) içerir ve henüz onlarla çalışmadık.

Başlık olmadan JPEG'in kodunu çözmek neredeyse imkansızdır (veya çok zordur). Sanki size resmi anlatmaya çalışıyormuşum gibi görünecek ve izlenimimi iletmek için kelimeler icat etmeye başlıyorum. Açıklama muhtemelen oldukça kısa olacaktır, çünkü tam olarak iletmek istediğim anlama sahip sözcükler icat edebilirim, ancak bunlar diğer herkes için bir anlam ifade etmeyecektir.

Aptalca gelebilir ama olan tam olarak budur. Her JPEG görüntüsü kendisine özel kodlarla sıkıştırılır. Kod sözlüğü başlıkta saklanır. Bu tekniğe Huffman kodu, sözlüğe ise Huffman tablosu denir. Başlıkta tablo iki baytla işaretlenir - 255 ve ardından 196. Her renk bileşeninin kendi tablosu olabilir.

Tablolarda yapılan değişiklikler herhangi bir görüntüyü kökten etkileyecektir. Bunun iyi bir örneği 15. satırı 1 olarak değiştirmektir.

JPEG formatı nasıl çalışır?

Bunun nedeni tabloların bireysel bitlerin nasıl okunması gerektiğini belirtmesidir. Şu ana kadar sadece ondalık formdaki ikili sayılarla çalıştık. Ancak bu, 1 sayısını bir baytta saklamak istiyorsanız, 00000001 gibi görüneceği gerçeğini bizden gizler, çünkü her baytın, bunlardan yalnızca birine ihtiyaç duyulsa bile, tam olarak sekiz bit içermesi gerekir.

Çok sayıda küçük numaranız varsa, bu potansiyel olarak büyük bir alan israfıdır. Huffman kodu, her sayının sekiz bit kaplaması zorunluluğunu ortadan kaldırmamıza olanak tanıyan bir tekniktir. Bu, iki bayt görürseniz şu anlama gelir:

234 115

O halde Huffman tablosuna bağlı olarak bunlar üç sayı olabilir. Bunları çıkarmak için önce bunları ayrı ayrı parçalara ayırmanız gerekir:

11101010 01110011

Daha sonra bunları nasıl gruplandıracağımızı bulmak için tabloya bakarız. Örneğin, bu ilk altı bit (111010) veya ondalık sistemde 58 olabilir, ardından beş bit (10011) veya 19 ve son olarak da son dört bit (0011) veya 3 olabilir.

Dolayısıyla sıkıştırmanın bu aşamasında baytları anlamak oldukça zordur. Baytlar göründükleri şeyi temsil etmiyor. Bu makalede tabloyla çalışmanın ayrıntılarına girmeyeceğim, ancak malzemelerin Bu konuyla ilgili çevrimiçi yeterli.

Bu bilgiyle yapabileceğiniz ilginç bir numara, başlığı JPEG'den ayırıp ayrı olarak saklamaktır. Aslında dosyayı yalnızca sizin okuyabildiğiniz ortaya çıktı. Facebook bunu dosyaları daha da küçültmek için yapıyor.

Başka ne yapılabilir, Huffman tablosunu biraz değiştirmek. Diğerleri için kırık bir resim gibi görünecek. Ve bunu düzeltmenin sihirli yolunu yalnızca siz bileceksiniz.

Özetleyelim: Peki JPEG'in kodunu çözmek için ne gerekiyor? Gerekli:

  1. Huffman tablolarını başlıktan çıkarın ve bitlerin kodunu çözün.
  2. Ters sayı uzunluğu ve delta kodlama dönüşümleri gerçekleştirerek, her 8x8 blok için her renk ve parlaklık bileşenine yönelik ayrı kosinüs dönüşüm katsayılarını çıkarın.
  3. Her 8x8 blok için piksel değerleri elde etmek amacıyla kosinüsleri katsayılara göre birleştirin.
  4. Alt örnekleme yapıldıysa renk bileşenlerini ölçeklendirin (bu bilgi başlıktadır).
  5. Her piksel için ortaya çıkan YCbCr değerlerini RGB'ye dönüştürün.
  6. Görüntüyü ekranda görüntüleyin!

Bir kediyle bir fotoğrafı görüntülemek için ciddi bir iş! Ancak hoşuma giden yanı JPEG teknolojisinin ne kadar insan odaklı olduğunu göstermesi. Algımızın özelliklerine dayanır ve geleneksel teknolojilere göre çok daha iyi sıkıştırma elde etmemizi sağlar. Artık JPEG'in nasıl çalıştığını anladığımıza göre, bu teknolojilerin diğer alanlara nasıl aktarılabileceğini hayal edebiliriz. Örneğin, videodaki delta kodlaması dosya boyutunda önemli bir azalma sağlayabilir, çünkü genellikle kareden kareye değişmeyen tüm alanlar (örneğin arka plan) vardır.

Makalede kullanılan kod, açıktır ve resimleri kendi resimlerinizle nasıl değiştireceğinize ilişkin talimatlar içerir.

Kaynak: habr.com

Yorum ekle