JPEG formatı necə işləyir

JPEG şəkilləri rəqəmsal həyatımızda hər yerdə mövcuddur, lakin bu şüurlu şüurun arxasında insan gözü tərəfindən qəbul edilməyən detalları silən alqoritmlər dayanır. Nəticə ən kiçik fayl ölçüsündə ən yüksək vizual keyfiyyətdir - lakin bunların hamısı necə işləyir? Gözlərimizin tam olaraq nəyi görmədiyini görək!

JPEG formatı necə işləyir

Dostunuza fotoşəkil göndərmək və onların hansı cihazdan, brauzerdən və ya əməliyyat sistemindən istifadə etdiyindən narahat olmamaq qabiliyyətini təbii qəbul etmək asandır - lakin bu həmişə belə deyildi. 1980-ci illərin əvvəllərində kompüterlər rəqəmsal şəkilləri saxlaya və göstərə bilirdilər, lakin bunun ən yaxşı yolu haqqında bir çox rəqabətli fikirlər var idi. Siz sadəcə olaraq bir kompüterdən digərinə şəkil göndərə və onun işləyəcəyinə ümid edə bilməzsiniz.

Bu problemi həll etmək üçün 1986-cı ildə dünyanın müxtəlif ölkələrindən ekspertlər komitəsi toplandı.Fotoqrafiya Mütəxəssislərinin Birgə Qrupu» (Joint Photographic Experts Group, JPEG), Beynəlxalq Standartlaşdırma Təşkilatı (ISO) və Beynəlxalq Elektrotexniki Komissiya (IEC), baş ofisi İsveçrənin Cenevrə şəhərində yerləşən iki beynəlxalq standartlar təşkilatı arasında birgə səy olaraq yaradılmışdır.

JPEG adlı bir qrup insan 1992-ci ildə JPEG rəqəmsal təsvir sıxılma standartını yaratdı. İnternetdən istifadə edən hər kəs yəqin ki, JPEG kodlu şəkillərlə qarşılaşıb. Bu, şəkilləri kodlaşdırmaq, göndərmək və saxlamaq üçün ən ümumi üsuldur. Veb səhifələrdən e-poçta və sosial mediaya qədər JPEG gündə milyardlarla dəfə istifadə olunur - demək olar ki, hər dəfə bir şəkilə onlayn baxdığımızda və ya onu göndərdiyimiz zaman. JPEG olmasaydı, internet daha az rəngarəng olardı, daha yavaş olardı və yəqin ki, daha az pişik şəkilləri olardı!

Bu məqalə JPEG şəklini necə deşifrə etmək haqqındadır. Başqa sözlə, kompüterdə saxlanılan sıxılmış məlumatları ekranda görünən görüntüyə çevirmək üçün nə tələb olunur. Bunu bilməyə dəyər, çünki təkcə hər gün istifadə etdiyimiz texnologiyanı başa düşmək vacibdir, həm də ona görə ki, sıxılma səviyyələrini açmaqla biz qavrayış və görmə və gözlərimizin hansı detallara ən həssas olduğunu öyrənirik.

Bundan əlavə, bu şəkildə şəkillərlə oynamaq çox maraqlıdır.

JPEG formatı necə işləyir

JPEG içərisinə baxır

Kompüterdə hər şey ikili ədədlər ardıcıllığı kimi saxlanılır. Tipik olaraq bu bitlər, sıfırlar və birlər bayt təşkil etmək üçün səkkizlik qruplarda qruplaşdırılır. Kompüterdə JPEG şəklini açdığınız zaman, bir şey (brauzer, əməliyyat sistemi, başqa bir şey) baytları deşifrə etməlidir, orijinal şəkli göstərilə bilən rənglərin siyahısı kimi bərpa etməlidir.

Bu şirini yükləsəniz pişik şəkli və mətn redaktorunda açın, bir dəstə uyğunsuz simvol görəcəksiniz.

JPEG formatı necə işləyir
Mən burada faylın məzmununu yoxlamaq üçün Notepad++ istifadə edirəm, çünki Windows-da Notepad kimi adi mətn redaktorları saxladıqdan sonra ikili faylı korlayacaq və o, daha JPEG formatını təmin etməyəcək.

Gözlərinizi ovuşdurub rəng ləkələri görməyə başlayanda beyninizi çaşdırdığınız kimi söz prosessorunda şəkil açmaq kompüteri çaşdırır!

Gördüyünüz bu ləkələr kimi tanınır fosfenlər, və ağıl tərəfindən yaradılan işıq stimulunun və ya halüsinasiyanın nəticəsi deyil. Onlar beyninizin optik sinirlərdəki hər hansı elektrik siqnalının işıq haqqında məlumat ötürdüyünü düşündüyü üçün baş verir. Beyin bu fərziyyələri irəli sürməlidir, çünki siqnalın səs, görüntü və ya başqa bir şey olduğunu bilmək üçün heç bir yol yoxdur. Bədəndəki bütün sinirlər eyni elektrik impulslarını ötürür. Gözlərinizə təzyiq etməklə siz vizual olmayan siqnallar göndərmiş olursunuz, ancaq beyninizin şərh etdiyi - bu halda səhvən - vizual bir şey kimi gözün reseptorlarını aktivləşdirirsiniz. Siz sözün əsl mənasında təzyiqi görə bilərsiniz!

Kompüterlərin beyinə nə qədər bənzədiyini düşünmək gülməlidir, lakin bu, həm də məlumatların mənasının - sinirlər vasitəsilə bədənə daşınmasından və ya kompüterdə saxlanmasından asılı olmayaraq - necə şərh edildiyindən nə qədər asılı olduğunu göstərmək üçün faydalı bir bənzətmədir. Bütün ikili məlumatlar istənilən növ məlumatı ötürə bilən əsas komponentlər olan XNUMX və XNUMX-lərdən ibarətdir. Kompüteriniz tez-tez fayl uzantıları kimi ipuçlarından istifadə edərək onları necə şərh edəcəyini anlayır. İndi biz onu mətn kimi şərh etməyə məcbur edirik, çünki mətn redaktorunun gözlədiyi budur.

JPEG kodunu necə deşifrə edəcəyimizi başa düşmək üçün orijinal siqnalların özlərini - ikili məlumatları görməliyik. Bu, onaltılıq redaktordan istifadə etməklə və ya birbaşa olaraq edilə bilər orijinal məqalə veb səhifəsi! Mətn sahəsində onun bütün baytları (başlıqdan başqa) onluq formada təqdim olunan bir şəkil var. Siz onları dəyişə bilərsiniz və skript tez bir zamanda yenidən kodlaşdıracaq və yeni bir şəkil yaradacaq.

JPEG formatı necə işləyir

Sadəcə bu redaktorla oynamaqla çox şey öyrənə bilərsiniz. Məsələn, piksellərin hansı ardıcıllıqla saxlandığını deyə bilərsinizmi?

Bu misalda qəribə olan odur ki, bəzi rəqəmlərin dəyişdirilməsi heç bir şəkildə təsvirə təsir etmir, amma məsələn, birinci sətirdə 17 rəqəmini 0 ilə əvəz etsəniz, şəkil tamamilə xarab olacaq!

JPEG formatı necə işləyir

Digər dəyişikliklər, məsələn, 7-ci sətirdəki 1988-nin 254 rəqəmi ilə əvəz edilməsi rəngi dəyişir, lakin yalnız sonrakı piksellərin.

JPEG formatı necə işləyir

Bəlkə də ən qəribəsi odur ki, bəzi rəqəmlər təkcə şəklin rəngini deyil, həm də şəklini dəyişir. 70-ci sətirdəki 12-i 2-yə dəyişin və nə demək istədiyimi görmək üçün şəklin yuxarı cərgəsinə baxın.

JPEG formatı necə işləyir

Hansı JPEG şəklini istifadə etməyinizdən asılı olmayaraq, baytları redaktə edərkən həmişə bu sirli şahmat nümunələrini tapacaqsınız.

Redaktorla oynayarkən fotoşəkilin bu baytlardan necə yenidən yaradıldığını başa düşmək çətindir, çünki JPEG sıxılma səviyyələrdə ardıcıl olaraq tətbiq olunan üç fərqli texnologiyadan ibarətdir. Gördüyümüz sirli davranışı üzə çıxarmaq üçün hər birini ayrıca öyrənəcəyik.

JPEG sıxılmanın üç səviyyəsi:

  1. Rəng alt nümunəsi.
  2. Diskret kosinus çevrilməsi və seçmə.
  3. Uzunluq kodlamasını işləyin, delta и Huffman

Sıxılmanın böyüklüyü barədə sizə fikir vermək üçün qeyd edin ki, yuxarıdakı şəkil 79 rəqəmi və ya təxminən 819 KB-ni təmsil edir. Əgər onu sıxılmadan saxlasaq, hər piksel üç rəqəm tələb edəcək - qırmızı, yaşıl və mavi komponentlər üçün. Bu, 79 ədəd və ya təqribən olacaq. 917 KB. JPEG sıxılma nəticəsində son fayl 700 dəfədən çox azaldıldı!

Əslində, bu görüntü daha çox sıxıla bilər. Aşağıda yan-yana iki şəkil var - sağdakı şəkil 16 KB-a qədər sıxılmışdır, yəni sıxılmamış versiyadan 57 dəfə kiçikdir!

JPEG formatı necə işləyir

Diqqətlə baxsanız, görərsiniz ki, bu şəkillər eyni deyil. Onların hər ikisi JPEG sıxılmalı şəkillərdir, lakin sağ olanı həcmcə daha kiçikdir. Həm də bir az daha pis görünür (fon rənginin kvadratlarına baxın). Buna görə də JPEG itkili sıxılma adlanır; Sıxılma prosesi zamanı şəkil dəyişir və bəzi detalları itirir.

1. Rəng alt nümunəsi

Budur, yalnız birinci səviyyəli sıxılma tətbiq olunan bir şəkil.

JPEG formatı necə işləyir
(İnteraktiv versiya - daxil orijinal məqalələr). Bir nömrənin silinməsi bütün rəngləri məhv edir. Bununla belə, əgər tam altı rəqəm çıxarılsa, bu, təsvirə praktiki olaraq heç bir təsir göstərmir.

İndi rəqəmləri deşifrə etmək bir az daha asandır. Bu, demək olar ki, hər baytın tam bir piksel dəyişdiyi rənglərin sadə siyahısıdır, lakin eyni zamanda o, artıq sıxılmamış təsvirin yarısı qədərdir (bu azaldılmış ölçüdə təxminən 300 KB yer tutur). Bunun səbəbini təxmin edə bilərsinizmi?

Görə bilərsiniz ki, bu nömrələr standart qırmızı, yaşıl və mavi komponentləri təmsil etmir, çünki bütün rəqəmləri sıfırlarla əvəz etsək, yaşıl şəkil alacağıq (ağ deyil).

JPEG formatı necə işləyir

Bunun səbəbi, bu baytların Y (parlaqlıq) mənasını verməsidir.

JPEG formatı necə işləyir

Cb (nisbi mavilik),

JPEG formatı necə işləyir

və Cr (nisbi qırmızılıq) şəkilləri.

JPEG formatı necə işləyir

Niyə RGB istifadə etmirsiniz? Axı, əksər müasir ekranlar belə işləyir. Monitorunuz qırmızı, yaşıl və mavi də daxil olmaqla istənilən rəngi hər piksel üçün müxtəlif intensivliklə göstərə bilər. Ağ rəng üçü də tam parlaqlıqda yandırmaqla, qara isə onları söndürməklə əldə edilir.

JPEG formatı necə işləyir

Bu da insan gözünün necə işlədiyinə çox bənzəyir. Gözlərimizdəki rəng reseptorları "adlanır"konuslar", və hər biri qırmızı, yaşıl və ya mavi rənglərə daha həssas olan üç növə bölünür [S tipli konuslar bənövşəyi-mavi rəngdə həssasdır (İngilis Qısa - qısa dalğa spektrindən S), M. -tip - yaşıl-sarı (İngilis dilindən M Medium - orta dalğa) və L-tipi - spektrin sarı-qırmızı (İngilis dilindən L Long - uzun dalğa) hissələrində. Bu üç növ konusların (və spektrin zümrüd yaşıl hissəsində həssas olan çubuqların) olması insana rəng görmə qabiliyyətini verir. / təqribən. tərcümə]. çubuqlar, gözümüzdəki başqa bir fotoreseptor növü, parlaqlıqdakı dəyişiklikləri aşkar etmək qabiliyyətinə malikdir, lakin rəngə daha çox həssasdır. Gözlərimizdə təxminən 120 milyon çubuq və yalnız 6 milyon konus var.

Buna görə də gözlərimiz parlaqlıqdakı dəyişiklikləri rəngdəki dəyişikliklərdən daha yaxşı aşkar edir. Rəngi ​​parlaqlıqdan ayırsanız, bir az rəngi silə bilərsiniz və heç kim heç nə hiss etməyəcək. Xroma subsempling təsvirin rəng komponentlərini parlaqlıq komponentlərindən daha aşağı ayırdetmədə təmsil etmək prosesidir. Yuxarıdakı nümunədə hər pikseldə tam olaraq bir Y komponenti var və dörd pikseldən ibarət hər bir fərdi qrupda tam olaraq bir Cb və bir Cr komponenti var. Buna görə də, şəkil orijinaldan dörd dəfə az rəngli məlumat ehtiva edir.

YCbCr rəng məkanı yalnız JPEG formatında istifadə edilmir. Əvvəlcə 1938-ci ildə televiziya proqramları üçün icad edilmişdir. Hər kəsin rəngli televizoru yoxdur, ona görə də rəng və parlaqlığın ayrılması hər kəsə eyni siqnal almağa imkan verirdi və rəngsiz televizorlar sadəcə parlaqlıq komponentindən istifadə edirdilər.

Beləliklə, bir nömrəni redaktordan çıxarmaq bütün rəngləri tamamilə məhv edir. Komponentlər YYYY Cb Cr formasında saxlanılır (əslində bu qaydada olması şərt deyil - saxlama sırası faylın başlığında göstərilmişdir). İlk rəqəmin silinməsi Cb-nin ilk dəyərinin Y, Cr-nin Cb kimi qəbul edilməsinə səbəb olacaq və ümumiyyətlə, şəklin bütün rənglərini dəyişdirən domino effektinə sahib olacaqsınız.

JPEG spesifikasiyası sizi YCbCr istifadə etməyə məcbur etmir. Lakin əksər fayllar ondan istifadə edir, çünki o, RGB-dən daha yaxşı aşağı nümunəli şəkillər yaradır. Amma bunun üçün mənim sözümü qəbul etmək lazım deyil. Aşağıdakı cədvəldə hər bir fərdi komponentin alt nümunəsinin RGB və YCbCr-də necə görünəcəyinə özünüz baxın.

JPEG formatı necə işləyir
(İnteraktiv versiya - daxil orijinal məqalələr).

Mavinin çıxarılması qırmızı və ya yaşıl rəng kimi nəzərə çarpmır. Bunun səbəbi gözlərinizdəki altı milyon konusdur, təxminən 64% qırmızıya, 32% yaşıla və 2% maviyə həssasdır.

Y komponentinin aşağı seçilməsi (solda aşağı) ən yaxşı şəkildə görünür. Kiçik bir dəyişiklik belə nəzərə çarpır.

Şəkili RGB-dən YCbCr-ə çevirmək faylın ölçüsünü azaltmır, lakin silinə bilən daha az görünən detalları tapmağı asanlaşdırır. İkinci mərhələdə itkili sıxılma baş verir. Məlumatların daha sıxıla bilən formada təqdim edilməsi ideyasına əsaslanır.

2. Diskret kosinus çevrilməsi və seçmə

Bu sıxılma səviyyəsi, əksər hallarda, JPEG ilə əlaqəlidir. Rəngləri YCbCr-ə çevirdikdən sonra komponentlər ayrı-ayrılıqda sıxılır, ona görə də biz yalnız Y komponentinə diqqət yetirə bilərik.Və bu təbəqəni tətbiq etdikdən sonra Y komponentinin baytları necə görünür.

JPEG formatı necə işləyir
(İnteraktiv versiya - daxil orijinal məqalələr). İnteraktiv versiyada bir pikselə klikləməklə redaktoru onu təmsil edən xəttə sürüşdürür. Sondan nömrələri çıxarmağa və ya müəyyən bir nömrəyə bir neçə sıfır əlavə etməyə çalışın.

İlk baxışdan çox pis sıxılma kimi görünür. Şəkildə 100 piksel var və onların parlaqlığını (Y-komponentləri) təmsil etmək üçün 000 ədəd lazımdır — bu, heç bir şeyi sıxışdırmaqdan daha pisdir!

Lakin qeyd edək ki, bu rəqəmlərin əksəriyyəti sıfırdır. Üstəlik, sətirlərin sonundakı bütün sıfırlar şəkli dəyişdirmədən silinə bilər. Təxminən 26 nömrə qalıb və bu, demək olar ki, 000 dəfə azdır!

Bu səviyyə şahmat naxışlarının sirrini ehtiva edir. Gördüyümüz digər effektlərdən fərqli olaraq, bu naxışların görünüşü səhv deyil. Onlar bütün görüntünün tikinti bloklarıdır. Redaktorun hər bir sətirində tam olaraq 64 rəqəm, 64 unikal nümunənin intensivliyinə uyğun diskret kosinus çevrilmə (DCT) əmsalları var.

Bu nümunələr kosinus süjeti əsasında formalaşır. Onlardan bəzilərinin necə göründüyü budur:

JPEG formatı necə işləyir
8 əmsaldan 64

Aşağıda bütün 64 nümunəni göstərən bir şəkil var.

JPEG formatı necə işləyir
(İnteraktiv versiya - daxil orijinal məqalələr).

Bu naxışlar xüsusi əhəmiyyət kəsb edir, çünki onlar 8x8 təsvirlərin əsasını təşkil edir. Əgər xətti cəbrlə tanış deyilsinizsə, bu o deməkdir ki, bu 8 naxışdan istənilən 8x64 təsvir hazırlana bilər. DCT təsvirlərin 8x8 bloklara bölünməsi və hər blokun bu 64 əmsalın birləşməsinə çevrilməsi prosesidir.

Hər hansı bir görüntünün 64 xüsusi naxışdan ibarət ola biləcəyi sehrli görünür. Bununla belə, bu, Yer kürəsində hər hansı bir yerin iki rəqəmlə təsvir edilə biləcəyini söyləməklə eynidir - enlik və uzunluq [yarımkürələri göstərən / təqribən. tərcümə]. Biz tez-tez Yerin səthini iki ölçülü hesab edirik, ona görə də bizə yalnız iki rəqəm lazımdır. 8x8 şəklin 64 ölçüsü var, ona görə də bizə 64 rəqəm lazımdır.

Bunun bizə sıxılma baxımından necə kömək etdiyi hələ aydın deyil. 64x8 təsviri təmsil etmək üçün bizə 8 rəqəm lazımdırsa, bu, 64 parlaqlıq komponentini saxlamaqdan niyə daha yaxşı olardı? Biz bunu üç RGB nömrəsini üç YCbCr nömrəsinə çevirdiyimiz səbəbdən edirik: bu, bizə incə detalları silməyə imkan verir.

Bu mərhələdə dəqiq hansı detalın silindiyini görmək çətindir, çünki JPEG 8x8 bloklara DCT tətbiq edir. Bununla belə, heç kim bizə onu bütün şəkilə tətbiq etməyi qadağan etmir. Bütün şəkilə tətbiq olunan Y komponenti üçün DCT necə görünür:

JPEG formatı necə işləyir

60-dən çox nömrəni fotoşəkildə demək olar ki, nəzərəçarpacaq dəyişikliklər olmadan sondan silmək olar.

JPEG formatı necə işləyir

Ancaq nəzərə alın ki, ilk beş rəqəmi sıfırlasaq, fərq göz qabağında olacaq.

JPEG formatı necə işləyir

Başlanğıcdakı rəqəmlər görüntüdəki aşağı tezlikli dəyişiklikləri ifadə edir və gözlərimiz bunu ən yaxşı şəkildə qəbul edir. Sona doğru rəqəmlər yüksək tezliklərdə fərq etmək daha çətin olan dəyişiklikləri göstərir. “Gözün görmədiyini görmək” üçün ilk 5000 rəqəmi sıfırlamaqla bu yüksək tezlikli detalları təcrid edə bilərik.

JPEG formatı necə işləyir

Biz təsvirin pikseldən pikselə ən böyük dəyişikliyin baş verdiyi bütün sahələrini görürük. Pişiyin gözləri, bığları, yorğanı və aşağı sol küncdəki kölgələr diqqəti cəlb edir. İlk 10 rəqəmi sıfırlamaqla daha da irəli gedə bilərsiniz:

JPEG formatı necə işləyir

20 000:

JPEG formatı necə işləyir

40 000:

JPEG formatı necə işləyir

60 000:

JPEG formatı necə işləyir

Bu yüksək tezlikli detallar sıxılma mərhələsində JPEG tərəfindən silinir. Rənglərin DCT əmsallarına çevrilməsində heç bir itki yoxdur. Zərər yüksək tezlikli və ya sıfıra yaxın dəyərlərin silindiyi seçmə mərhələsində baş verir. JPEG qənaət keyfiyyətini aşağı saldıqda, proqram silinən dəyərlərin sayının həddini artırır, bu da faylın ölçüsünü azaldır, lakin şəkli daha pikselli edir. Ona görə də birinci hissədə 57 dəfə kiçik olan şəkil belə görünürdü. Hər 8x8 blok yüksək keyfiyyətli versiya ilə müqayisədə daha az DCT əmsalları ilə təmsil olunurdu.

Şəkillərin tədricən axını kimi gözəl bir effekt yarada bilərsiniz. Siz getdikcə daha çox əmsal endirildikcə getdikcə təfərrüatlı olan bulanıq şəkil göstərə bilərsiniz.

Sadəcə əylənmək üçün sadəcə 24 nömrədən istifadə edərək əldə etdiyiniz şey budur:

JPEG formatı necə işləyir

Və ya sadəcə 5000:

JPEG formatı necə işləyir

Çox bulanıq, amma bir şəkildə tanınır!

3. Run uzunluğu kodlaşdırma, delta və Huffman

İndiyə qədər sıxılmanın bütün mərhələləri itkili olmuşdur. Sonuncu mərhələ isə əksinə, itkisiz davam edir. Məlumatı silmir, lakin faylın ölçüsünü əhəmiyyətli dərəcədə azaldır.

Məlumatı atmadan bir şeyi necə sıxışdırmaq olar? Təsəvvür edin ki, 700 x 437 ölçülü sadə qara düzbucaqlını necə təsvir edəcəyik.

JPEG bunun üçün 5000 rəqəmdən istifadə edir, lakin daha yaxşı nəticələr əldə etmək olar. Belə bir təsviri mümkün qədər az baytda təsvir edən kodlaşdırma sxemini təsəvvür edə bilərsinizmi?

Mənim təklif edə biləcəyim minimal sxem dörddən istifadə edir: üçü rəngi təmsil etmək üçün, dördüncüsü isə bu rəngin neçə piksel olduğunu göstərmək üçün. Təkrarlanan dəyərləri bu sıxlaşdırılmış şəkildə təmsil etmək ideyası uzunluqlu kodlaşdırma adlanır. Bu, itkisizdir, çünki biz kodlanmış məlumatları orijinal formasına qaytara bilərik.

Qara düzbucaqlı JPEG faylı 4 baytdan çox böyükdür - unutmayın ki, DCT səviyyəsində sıxılma 8x8 piksel bloklarına tətbiq olunur. Buna görə də, ən azı, hər 64 piksel üçün bir DCT əmsalı lazımdır. Bizə birinə ehtiyacımız var, çünki bir DCT əmsalı və ardınca 63 sıfırın saxlanması əvəzinə, iş uzunluğu kodlaması bizə bir nömrə saxlamağa və "bütün digərlərinin sıfır olduğunu" göstərməyə imkan verir.

Delta kodlaşdırması, hər baytın mütləq dəyərdən daha çox bəzi dəyərdən fərqi ehtiva etdiyi bir texnikadır. Beləliklə, müəyyən baytların redaktə edilməsi bütün digər piksellərin rəngini dəyişir. Məsələn, saxlamaq əvəzinə

12 13 14 14 14 13 13 14

Biz 12 ilə başlaya bilərik və sonra növbəti rəqəmi əldə etmək üçün nə qədər əlavə və ya çıxmalı olduğumuzu göstərə bilərik. Delta kodlaşdırmada bu ardıcıllıq aşağıdakı formanı alır:

12 1 1 0 0 -1 0 1

Dönüştürülmüş məlumatlar orijinal məlumatdan kiçik deyil, lakin onu sıxışdırmaq daha asandır. İş uzunluğu kodlaşdırmadan əvvəl delta kodlaşdırmanın tətbiqi itkisiz sıxılma olmaqla çox kömək edə bilər.

Delta kodlaşdırma 8x8 blokları xaricində istifadə olunan bir neçə üsuldan biridir. 64 DCT əmsalından biri sadəcə olaraq sabit dalğa funksiyasıdır (bərk rəng). O, luma komponentləri üçün hər blokun orta parlaqlığını və ya Cb komponentləri üçün orta maviliyi və s. Hər bir DCT blokunun ilk dəyəri DC dəyəri adlanır və hər bir DC dəyəri əvvəlkilərə nisbətən kodlanmış deltadır. Buna görə də, birinci blokun parlaqlığının dəyişdirilməsi bütün bloklara təsir edəcəkdir.

Son sirr qalır: təki dəyişdirmək bütün mənzərəni necə tamamilə pozur? İndiyə qədər sıxılma səviyyələri belə xüsusiyyətlərə malik deyildi. Cavab JPEG başlığındadır. İlk 500 baytda təsvir haqqında metadata var - en, hündürlük və s. və biz onlarla hələ işləməmişik.

Başlıq olmadan JPEG kodunu deşifrə etmək demək olar ki, mümkün deyil (və ya çox çətindir). Sanki şəkli sizə təsvir etməyə çalışıram və təəssüratımı çatdırmaq üçün sözlər uydurmağa başlayıram. Təsvir, yəqin ki, kifayət qədər sıxlaşdırılacaq, çünki mən çatdırmaq istədiyim məna ilə sözləri icad edə bilərəm, amma hər kəs üçün mənası yoxdur.

Bu axmaq səslənir, amma baş verənlər tam olaraq budur. Hər bir JPEG şəkli ona məxsus kodlarla sıxılır. Kod lüğəti başlıqda saxlanılır. Bu texnika Huffman kodu, lüğətə isə Huffman cədvəli deyilir. Başlıqda cədvəl iki baytla qeyd olunur - 255 və sonra 196. Hər bir rəng komponentinin öz cədvəli ola bilər.

Cədvəllərə edilən dəyişikliklər istənilən görüntüyə köklü şəkildə təsir edəcək. Yaxşı bir nümunə 15-ci sətri 1-yə dəyişdirməkdir.

JPEG formatı necə işləyir

Bu, cədvəllərin ayrı-ayrı bitlərin necə oxunacağını müəyyən etdiyi üçün baş verir. İndiyə qədər biz yalnız onluq formada olan ikilik ədədlərlə işləmişik. Lakin bu bizdən gizlədir ki, əgər siz baytda 1 rəqəmini saxlamaq istəyirsinizsə, o, 00000001 kimi görünəcək, çünki onlardan yalnız birinə ehtiyac olsa belə, hər baytda tam olaraq səkkiz bit olmalıdır.

Çox kiçik nömrələriniz varsa, bu, potensial olaraq böyük yer itkisidir. Huffman kodu bizə hər nömrənin səkkiz bit tutması tələbini yüngülləşdirməyə imkan verən bir texnikadır. Bu o deməkdir ki, əgər siz iki bayt görürsünüzsə:

234 115

Sonra Huffman cədvəlindən asılı olaraq bunlar üç ədəd ola bilər. Onları çıxarmaq üçün əvvəlcə onları fərdi bitlərə bölmək lazımdır:

11101010 01110011

Sonra onları necə qruplaşdırmaq lazım olduğunu anlamaq üçün cədvələ baxırıq. Məsələn, bu, ilk altı bit (111010) və ya onluqda 58, ardınca beş bit (10011) və ya 19 və nəhayət, son dörd bit (0011) və ya 3 ola bilər.

Ona görə də bu sıxılma mərhələsində baytları başa düşmək çox çətindir. Baytlar göründüklərini təmsil etmir. Bu yazıda cədvəllə işləməyin təfərrüatlarına girməyəcəyəm, amma materiallar Bu mövzuda onlayn kifayətdir.

Bu biliklə edə biləcəyiniz maraqlı hiylələrdən biri başlığı JPEG-dən ayırmaq və ayrıca saxlamaqdır. Əslində, belə çıxır ki, faylı yalnız siz oxuya bilərsiniz. Facebook bunu faylları daha da kiçik etmək üçün edir.

Başqa nə edilə bilər, Huffman cədvəlini bir qədər dəyişdirməkdir. Digərləri üçün bu, qırıq bir şəkil kimi görünəcək. Və onu düzəltməyin sehrli yolunu yalnız siz biləcəksiniz.

Xülasə edək: JPEG kodunu deşifrə etmək üçün nə lazımdır? Zəruri:

  1. Huffman cədvəl(lər)ini başlıqdan çıxarın və bitləri deşifrə edin.
  2. Hər 8x8 blok üçün hər bir rəng və parlaqlıq komponenti üçün diskret kosinus çevrilmə əmsallarını çıxarın, tərs uzunluq və delta kodlaşdırma çevrilmələrini həyata keçirin.
  3. Hər 8x8 blok üçün piksel dəyərlərini əldə etmək üçün əmsallara əsaslanan kosinusları birləşdirin.
  4. Əgər alt seçmə aparılıbsa, rəng komponentlərini miqyaslayın (bu məlumat başlıqdadır).
  5. Hər piksel üçün yaranan YCbCr dəyərlərini RGB-yə çevirin.
  6. Şəkli ekranda göstərin!

Sadəcə pişiklə şəkilə baxmaq üçün ciddi iş! Bununla belə, mənim xoşuma gələn şey, JPEG texnologiyasının nə qədər insan mərkəzli olduğunu göstərməsidir. O, bizim qavrayışımızın xüsusiyyətlərinə əsaslanır və adi texnologiyalardan daha yaxşı sıxılma əldə etməyə imkan verir. İndi biz JPEG-in necə işlədiyini başa düşdükdən sonra bu texnologiyaların digər sahələrə necə ötürülə biləcəyini təsəvvür edə bilərik. Məsələn, videoda delta kodlaşdırması fayl ölçüsündə əhəmiyyətli bir azalma təmin edə bilər, çünki çox vaxt çərçivədən çərçivəyə dəyişməyən bütün sahələr var (məsələn, fon).

Məqalədə istifadə olunan kod, açıqdır və şəkilləri öz şəkillərinizlə necə əvəz etmək barədə təlimatları ehtiva edir.

Mənbə: www.habr.com

Добавить комментарий