JPEG රූප අපගේ ඩිජිටල් ජීවිතයේ සෑම තැනකම දක්නට ලැබේ, නමුත් මෙම දැනුවත් කිරීමේ ආවරණය පිටුපස මිනිස් ඇසට නොපෙනෙන විස්තර ඉවත් කරන ඇල්ගොරිතම ඇත. ප්රතිඵලය වන්නේ කුඩාම ගොනු ප්රමාණයේ ඉහළම දෘශ්ය ගුණයයි - නමුත් ඒ සියල්ල හරියටම ක්රියා කරන්නේ කෙසේද? අපි බලමු අපේ ඇස්වලට හරියටම නොපෙනෙන දේ!
මිතුරෙකුට ඡායාරූපයක් යැවීමට සහ ඔවුන් භාවිතා කරන උපාංගය, බ්රවුසරය හෝ මෙහෙයුම් පද්ධතිය ගැන කරදර නොවී සිටීමේ හැකියාව සැහැල්ලුවෙන් ගැනීම පහසුය - නමුත් එය සැමවිටම එසේ නොවීය. 1980 ගණන්වල මුල් භාගය වන විට, පරිගණකවලට ඩිජිටල් රූප ගබඩා කර ප්රදර්ශනය කළ හැකි නමුත් මෙය කිරීමට හොඳම ක්රමය පිළිබඳව බොහෝ තරඟකාරී අදහස් තිබුණි. ඔබට එක් පරිගණකයකින් තවත් පරිගණකයකට රූපයක් යැවීමට නොහැකි අතර එය ක්රියාත්මක වේ යැයි බලාපොරොත්තු වේ.
මෙම ගැටළුව විසඳීම සඳහා ලොව පුරා විශේෂඥයන්ගෙන් සමන්විත කමිටුවක් 1986 දී රැස් කරන ලදී.
JPEG නම් පුද්ගලයින් කණ්ඩායමක් 1992 දී JPEG ඩිජිටල් රූප සම්පීඩන ප්රමිතිය නිර්මාණය කරන ලදී. අන්තර්ජාලය භාවිතා කර ඇති ඕනෑම කෙනෙකුට JPEG කේතනය කරන ලද පින්තූර හමු වී ඇත. පින්තූර සංකේතනය කිරීමට, යැවීමට සහ ගබඩා කිරීමට වඩාත් පොදු ක්රමය මෙයයි. වෙබ් පිටුවල සිට විද්යුත් තැපෑල දක්වා සමාජ මාධ්ය දක්වා, JPEG දිනකට බිලියන ගණනක් භාවිතා කරයි—අපි අන්තර්ජාලය හරහා පින්තූරයක් බලන සෑම අවස්ථාවකම හෝ යවන සෑම අවස්ථාවකම. JPEG නොමැතිව, වෙබය අඩු වර්ණවත්, මන්දගාමී සහ බොහෝ විට බළලුන්ගේ පින්තූර අඩු වනු ඇත!
මෙම ලිපිය JPEG රූපයක් විකේතනය කරන්නේ කෙසේද යන්නයි. වෙනත් වචන වලින් කිවහොත්, පරිගණකයක ගබඩා කර ඇති සම්පීඩිත දත්ත තිරය මත දිස්වන රූපයක් බවට පරිවර්තනය කිරීමට අවශ්ය දේ. මෙය දැන ගැනීම වටී, අප දිනපතා භාවිතා කරන තාක්ෂණය අවබෝධ කර ගැනීම වැදගත් වන නිසා පමණක් නොව, සම්පීඩන මට්ටම් අගුළු ඇරීමෙන්, අපි සංජානනය සහ දර්ශනය ගැන වැඩි විස්තර ඉගෙන ගනිමු, සහ අපගේ ඇස් වඩාත් සංවේදී වන තොරතුරු මොනවාද.
මීට අමතරව, මේ ආකාරයෙන් පින්තූර සමඟ සෙල්ලම් කිරීම ඉතා සිත්ගන්නා සුළුය.
JPEG ඇතුල බලනවා
පරිගණකයක, සෑම දෙයක්ම ද්විමය සංඛ්යා අනුපිළිවෙලක් ලෙස ගබඩා කර ඇත. සාමාන්යයෙන් මෙම බිටු, ශුන්ය සහ එක, බයිට් සෑදීම සඳහා අටක කාණ්ඩවලට කාණ්ඩ කර ඇත. ඔබ පරිගණකයක JPEG රූපයක් විවෘත කරන විට, යමක් (බ්රවුසරයක්, මෙහෙයුම් පද්ධතියක්, වෙනත් දෙයක්) බයිට් විකේතනය කළ යුතුය, මුල් රූපය ප්රදර්ශනය කළ හැකි වර්ණ ලැයිස්තුවක් ලෙස ප්රතිස්ථාපනය කරයි.
ඔබ මෙම මිහිරි බාගත කළහොත්
Windows හි Notepad වැනි සාමාන්ය පෙළ සංස්කාරකයන් සුරැකීමෙන් පසු ද්විමය ගොනුව දූෂිත කරන අතර එය තවදුරටත් JPEG ආකෘතිය තෘප්තිමත් නොකරන බැවින්, ගොනුවේ අන්තර්ගතය පරීක්ෂා කිරීමට මම Notepad++ භාවිතා කරමි.
වර්ඩ් ප්රොසෙසරයක පින්තූරයක් විවෘත කිරීම පරිගණකය අවුල් කරයි, හරියට ඔබ ඔබේ ඇස් අතුල්ලමින් වර්ණ ලප දැකීමට පටන් ගත් විට ඔබේ මොළය ව්යාකූල කරයි!
ඔබ දකින මෙම ලප හැඳින්වෙන්නේ
පරිගණක මොළයට කෙතරම් සමානදැයි සිතීම හාස්යජනක ය, නමුත් දත්තවල තේරුම - ස්නායු මගින් ශරීරය හරහා ගෙන ගියත්, පරිගණකයක ගබඩා කර තිබුණත් - එය අර්ථකථනය කරන ආකාරය මත රඳා පවතින ආකාරය නිදර්ශනය කිරීමට එය ප්රයෝජනවත් සාදෘශ්යයකි. සියලුම ද්විමය දත්ත 0s සහ 1s වලින් සෑදී ඇත, ඕනෑම ආකාරයක තොරතුරු ලබා දිය හැකි මූලික සංරචක වේ. ගොනු දිගු වැනි හෝඩුවාවන් භාවිතයෙන් ඔබේ පරිගණකය බොහෝ විට ඒවා අර්ථ නිරූපණය කරන්නේ කෙසේදැයි සොයා බලයි. දැන් අපි එය පෙළ ලෙස අර්ථකථනය කිරීමට බල කරමු, මන්ද පෙළ සංස්කාරකය අපේක්ෂා කරන්නේ එයයි.
JPEG විකේතනය කරන්නේ කෙසේද යන්න තේරුම් ගැනීමට, අපි මුල් සංඥා තමන්ම දැකිය යුතුය - ද්විමය දත්ත. මෙය ෂඩ් දශම සංස්කාරකයක් භාවිතයෙන් හෝ සෘජුවම ක්රියාත්මක කළ හැක
මෙම සංස්කාරකය සමඟ සෙල්ලම් කිරීමෙන් ඔබට බොහෝ දේ ඉගෙන ගත හැකිය. උදාහරණයක් ලෙස, පික්සෙල් ගබඩා කර ඇත්තේ කුමන අනුපිළිවෙලකටදැයි ඔබට පැවසිය හැකිද?
මෙම උදාහරණයේ ඇති අමුතුම දෙය නම්, සමහර සංඛ්යා වෙනස් කිරීම රූපයට කිසිසේත්ම බලපාන්නේ නැත, නමුත්, උදාහරණයක් ලෙස, ඔබ පළමු පේළියේ අංක 17 වෙනුවට 0 සමඟ ප්රතිස්ථාපනය කළහොත්, ඡායාරූපය සම්පූර්ණයෙන්ම විනාශ වේ!
7 රේඛාවේ 1988 වෙනුවට අංක 254 යෙදීම වැනි වෙනත් වෙනස්කම්, වර්ණය වෙනස් කරයි, නමුත් පසුව පික්සලවල පමණි.
සමහර විට අමුතුම දෙය නම්, සමහර සංඛ්යා වර්ණය පමණක් නොව, රූපයේ හැඩය වෙනස් කිරීමයි. පේළියේ 70 සිට 12 දක්වා 2 වෙනස් කර මා අදහස් කරන්නේ කුමක්දැයි බැලීමට රූපයේ ඉහළ පේළිය දෙස බලන්න.
ඔබ භාවිතා කරන JPEG රූපය කුමක් වුවත්, බයිට් සංස්කරණය කිරීමේදී ඔබට මෙම අද්භූත චෙස් රටා සෑම විටම සොයාගත හැකිය.
සංස්කාරකය සමඟ සෙල්ලම් කරන විට, JPEG සම්පීඩනය විවිධ තාක්ෂණයන් තුනකින් සමන්විත වන බැවින්, මට්ටම් අනුක්රමිකව යොදන බැවින්, මෙම බයිට් වලින් ඡායාරූපයක් ප්රතිනිර්මාණය කරන්නේ කෙසේදැයි තේරුම් ගැනීමට අපහසුය. අප දකින අද්භූත හැසිරීම් අනාවරණය කර ගැනීමට අපි එකින් එක වෙන වෙනම අධ්යයනය කරන්නෙමු.
JPEG සම්පීඩන මට්ටම් තුනක්:
ඔබට සම්පීඩනයේ විශාලත්වය පිළිබඳ අදහසක් ලබා දීම සඳහා, ඉහත රූපයෙන් අංක 79 ක් හෝ 819 KB පමණ වන බව සලකන්න. අපි එය සම්පීඩනයකින් තොරව ගබඩා කළහොත්, සෑම පික්සලයකටම අංක තුනක් අවශ්ය වේ - රතු, කොළ සහ නිල් සංරචක සඳහා. මෙය සංඛ්යා 79 ක් හෝ දළ වශයෙන් වනු ඇත. 917 කි.බ. JPEG සම්පීඩනයේ ප්රතිඵලයක් ලෙස, අවසාන ගොනුව 700 ගුණයකට වඩා අඩු විය!
ඇත්ත වශයෙන්ම, මෙම රූපය තවත් බොහෝ සම්පීඩනය කළ හැකිය. පහත දැක්වෙන්නේ රූප දෙකක් එක පැත්තකින් - දකුණු පස ඇති ඡායාරූපය 16 KB දක්වා සම්පීඩනය කර ඇත, එනම්, සම්පීඩනය නොකළ අනුවාදයට වඩා 57 ගුණයකින් කුඩා වේ!
ඔබ හොඳින් බැලුවහොත්, මෙම රූප සමාන නොවන බව ඔබට පෙනෙනු ඇත. ඒවා දෙකම JPEG සම්පීඩනය සහිත රූප, නමුත් නිවැරදි එක පරිමාවෙන් වඩා කුඩා වේ. එය ද ටිකක් නරක ලෙස පෙනේ (පසුබිම් වර්ණ කොටු බලන්න). JPEG පාඩු සම්පීඩනය ලෙසද හඳුන්වන්නේ එබැවිනි; සම්පීඩන ක්රියාවලියේදී, රූපය වෙනස් වන අතර සමහර විස්තර අහිමි වේ.
1. වර්ණ උප නියැදීම
මෙන්න පළමු මට්ටමේ සම්පීඩනය පමණක් යෙදූ රූපයක්.
(අන්තර්ක්රියාකාරී අනුවාදය - in
දැන් ඉලක්කම් විකේතනය කිරීම ටිකක් පහසුයි. මෙය පාහේ සරල වර්ණ ලැයිස්තුවක් වන අතර, සෑම බයිටයක්ම හරියටම පික්සලයක් වෙනස් කරයි, නමුත් ඒ සමඟම එය දැනටමත් සම්පීඩිත නොවන රූපයේ ප්රමාණයෙන් අඩකි (මෙම අඩු කරන ලද ප්රමාණයෙන් 300 KB පමණ ගතවනු ඇත). ඔබට අනුමාන කළ හැකිද?
මෙම සංඛ්යා සම්මත රතු, කොළ සහ නිල් සංරචක නියෝජනය නොකරන බව ඔබට පෙනෙනු ඇත, මන්ද අපි සියලු සංඛ්යා ශුන්ය සමඟ ප්රතිස්ථාපනය කළහොත් අපට හරිත රූපයක් ලැබෙනු ඇත (සුදු වෙනුවට).
මෙයට හේතුව මෙම බයිට් Y (දීප්තිය) සඳහා වන බැවිනි.
Cb (සාපේක්ෂ නිල් පැහැය),
සහ Cr (සාපේක්ෂ රතු පැහැය) පින්තූර.
RGB භාවිතා නොකරන්නේ ඇයි? සියල්ලට පසු, බොහෝ නවීන තිර වැඩ කරන්නේ මෙයයි. ඔබේ මොනිටරය එක් එක් පික්සල සඳහා විවිධ තීව්රතාවයන් සහිත රතු, කොළ සහ නිල් ඇතුළු ඕනෑම වර්ණයක් පෙන්විය හැක. සම්පූර්ණ දීප්තියෙන් තුනම ක්රියාත්මක කිරීමෙන් සුදු පැහැය ලබා ගන්නා අතර ඒවා ක්රියා විරහිත කිරීමෙන් කළු පැහැය ලැබේ.
මෙය ද මිනිස් ඇස ක්රියා කරන ආකාරය හා බොහෝ දුරට සමාන ය. අපේ ඇස්වල වර්ණ ප්රතිග්රාහක හඳුන්වන්නේ "
වර්ණ වෙනස්වීම් වලට වඩා දීප්තියේ වෙනස්වීම් හඳුනාගැනීමට අපගේ ඇස් වඩා හොඳ වන්නේ එබැවිනි. ඔබ දීප්තියෙන් වර්ණය වෙන් කරන්නේ නම්, ඔබට කුඩා වර්ණයක් ඉවත් කළ හැකි අතර කිසිවෙකු කිසිවක් නොදකිනු ඇත. ක්රෝමා උප නියැදීම යනු ලුමිනන්ස් සංරචකවලට වඩා අඩු විභේදනයකින් රූපයක වර්ණ සංරචක නිරූපණය කිරීමේ ක්රියාවලියයි. ඉහත උදාහරණයේ දී, සෑම පික්සලයකටම හරියටම Y සංරචකයක් ඇති අතර, පික්සල හතරකින් යුත් සෑම කණ්ඩායමකටම හරියටම Cb එකක් සහ Cr සංරචකයක් ඇත. එමනිසා, රූපයේ මුල් පිටපතට වඩා හතර ගුණයකින් අඩු වර්ණ තොරතුරු අඩංගු වේ.
YCbCr වර්ණ අවකාශය භාවිතා කරන්නේ JPEG හි පමණක් නොවේ. එය මුලින් 1938 දී රූපවාහිනී වැඩසටහන් සඳහා නිර්මාණය කරන ලදී. සෑම කෙනෙකුටම වර්ණ රූපවාහිනියක් නොමැත, එබැවින් වර්ණය හා දීප්තිය වෙන් කිරීමෙන් සෑම කෙනෙකුටම එකම සංඥාවක් ලබා ගත හැකි විය, සහ වර්ණ නොමැති රූපවාහිනිය සරලව දීප්තිය සංරචකය පමණක් භාවිතා කළේය.
එබැවින් සංස්කාරකයෙන් එක් අංකයක් ඉවත් කිරීම සියලු වර්ණ සම්පූර්ණයෙන්ම විනාශ කරයි. සංරචක YYYY Cb Cr ආකාරයෙන් ගබඩා කර ඇත (ඇත්ත වශයෙන්ම, එම අනුපිළිවෙලෙහි අවශ්ය නොවේ - ගබඩා අනුපිළිවෙල ගොනු ශීර්ෂයේ දක්වා ඇත). පළමු අංකය ඉවත් කිරීමෙන් Cb හි පළමු අගය Y ලෙසත්, Cr Cb ලෙසත්, සාමාන්යයෙන් ඔබට පින්තූරයේ සියලු වර්ණ මාරු කරන ඩොමිනෝ ආචරණයක් ලැබෙනු ඇත.
JPEG පිරිවිතර YCbCr භාවිතා කිරීමට ඔබට බල නොකරයි. නමුත් බොහෝ ලිපිගොනු එය භාවිතා කරන්නේ එය RGB වලට වඩා හොඳ පහත් රූප නිපදවන බැවිනි. නමුත් ඔබ ඒ සඳහා මගේ වචනය පිළිගත යුතු නැත. RGB සහ YCbCr දෙකෙහිම එක් එක් සංරචකයේ උප නියැදීම කෙබඳු වේද යන්න පහත වගුවේ ඔබම බලන්න.
(අන්තර්ක්රියාකාරී අනුවාදය - in
නිල් ඉවත් කිරීම රතු හෝ කොළ ලෙස සැලකිය යුතු නොවේ. ඒ ඔබේ ඇස්වල කේතු මිලියන හයක් නිසා 64%ක් පමණ රතු පාටට, 32%ක් කොළ පාටට සහ 2%ක් නිල් පාටට සංවේදී වෙනවා.
Y සංරචකයේ පහත වැටීම (පහළ වමේ) හොඳින්ම දක්නට ලැබේ. කුඩා වෙනසක් පවා කැපී පෙනේ.
රූපයක් RGB සිට YCbCr වෙත පරිවර්තනය කිරීමෙන් ගොනු ප්රමාණය අඩු නොවේ, නමුත් එය ඉවත් කළ හැකි අඩු දෘශ්ය තොරතුරු සොයා ගැනීම පහසු කරයි. ලොසි සම්පීඩනය දෙවන අදියරේදී සිදු වේ. එය වඩාත් සංකෝචනය කළ හැකි ආකාරයෙන් දත්ත ඉදිරිපත් කිරීමේ අදහස මත පදනම් වේ.
2. විවික්ත කොසයින් පරිවර්තනය සහ නියැදීම
මෙම සම්පීඩන මට්ටම, බොහෝ දුරට, JPEG යනු කුමක්ද යන්නයි. YCbCr වෙත වර්ණ පරිවර්තනය කිරීමෙන් පසුව, සංරචක තනි තනිව සම්පීඩනය කරනු ලැබේ, එවිට අපට Y සංරචකය මත පමණක් අවධානය යොමු කළ හැකි අතර, මෙම ස්තරය යෙදීමෙන් පසු Y සංරචක බයිට් පෙනෙන්නේ කෙසේද යන්නයි.
(අන්තර්ක්රියාකාරී අනුවාදය - in
මුලින්ම බැලූ බැල්මට එය ඉතා නරක සම්පීඩනයක් ලෙස පෙනේ. රූපයක පික්සල 100ක් ඇති අතර ඒවායේ දීප්තිය (Y-සංරචක) නියෝජනය කිරීමට සංඛ්යා 000ක් අවශ්ය වේ—එය කිසිසේත්ම සම්පීඩනය නොකිරීමට වඩා නරක දෙයකි!
කෙසේ වෙතත්, මෙම සංඛ්යා බොහොමයක් ශුන්ය බව සලකන්න. එපමණක් නොව, පේළි අවසානයේ ඇති සියලුම බිංදු රූපය වෙනස් නොකර ඉවත් කළ හැකිය. අංක 26 ක් පමණ ඉතිරිව ඇති අතර මෙය 000 ගුණයකින් අඩුය!
මෙම මට්ටමේ චෙස් රටා වල රහස අඩංගු වේ. අප දැක ඇති අනෙකුත් බලපෑම් මෙන් නොව, මෙම රටා වල පෙනුම දෝෂයක් නොවේ. ඒවා සමස්ත රූපයේ ගොඩනැඟිලි කොටස් වේ. සංස්කාරකයේ සෑම පේළියකම අනන්ය රටා 64ක තීව්රතාවයට අනුරූප වන විවික්ත කෝසයින් පරිවර්තන (ඩීසීටී) සංගුණක හරියටම සංඛ්යා 64ක් අඩංගු වේ.
මෙම රටා සෑදී ඇත්තේ කොසයින් ප්ලොට් මත පදනම්වය. ඒවායින් සමහරක් පෙනෙන්නේ කෙසේද යන්න මෙන්න:
8 න් 64 යි
පහත දැක්වෙන්නේ රටා 64ම පෙන්වන රූපයකි.
(අන්තර්ක්රියාකාරී අනුවාදය - in
මෙම රටා විශේෂ වැදගත්කමක් දරන්නේ ඒවා 8x8 රූපවල පදනම වන බැවිනි. ඔබ රේඛීය වීජ ගණිතය ගැන නුහුරු නම්, මෙයින් අදහස් කරන්නේ මෙම රටා 8 න් ඕනෑම 8x64 රූපයක් සෑදිය හැකි බවයි. DCT යනු රූප 8x8 කුට්ටි වලට බෙදීම සහ එක් එක් කොටස මෙම සංගුණක 64 හි එකතුවක් බවට පරිවර්තනය කිරීමේ ක්රියාවලියයි.
ඕනෑම රූපයක් නිශ්චිත රටා 64 කින් සමන්විත විය හැකි බව මැජික් මෙන් පෙනේ. කෙසේ වෙතත්, මෙය පෘථිවියේ ඕනෑම ස්ථානයක් ඉලක්කම් දෙකකින් විස්තර කළ හැකි බව පැවසීම සමාන වේ - අක්ෂාංශ සහ දේශාංශ [අර්ධගෝල / දළ වශයෙන්. පරිවර්තනය.]. අප බොහෝ විට සිතන්නේ පෘථිවි පෘෂ්ඨය ද්විමාන ලෙස බැවින් අපට අවශ්ය වන්නේ සංඛ්යා දෙකක් පමණි. 8x8 රූපයකට මාන 64ක් ඇත, ඒ නිසා අපට අංක 64ක් අවශ්යයි.
සම්පීඩනය සම්බන්ධයෙන් මෙය අපට උපකාර කරන්නේ කෙසේද යන්න තවමත් පැහැදිලි නැත. 64x8 රූපයක් නිරූපණය කිරීමට අපට සංඛ්යා 8ක් අවශ්ය නම්, මෙය දීප්ති සංරචක 64ක් ගබඩා කිරීමට වඩා හොඳ වන්නේ ඇයි? අපි මෙය කරන්නේ එකම හේතුව නිසා අපි RGB අංක තුනක් YCbCr අංක තුනක් බවට පත් කළෙමු: එය අපට සියුම් විස්තර ඉවත් කිරීමට ඉඩ සලසයි.
JPEG DCT 8x8 කුට්ටි වලට යොදන නිසා මෙම අදියරේදී ඉවත් කරන ලද විස්තරය නිවැරදිව දැකීම අපහසුය. කෙසේ වෙතත්, එය සම්පූර්ණ පින්තූරයට අදාළ කිරීමට කිසිවෙකු අපට තහනම් නොකරයි. සම්පූර්ණ පින්තූරයට යොදන ලද Y සංරචකය සඳහා DCT පෙනෙන ආකාරය මෙන්න:
60 කට වඩා වැඩි සංඛ්යාවක් ඡායාරූපයේ කිසිදු සැලකිය යුතු වෙනසක් නොමැතිව අවසානයේ සිට ඉවත් කළ හැක.
කෙසේ වෙතත්, අපි පළමු අංක පහෙන් ශුන්ය කළහොත්, වෙනස පැහැදිලිව පෙනෙන බව සලකන්න.
ආරම්භයේ ඇති සංඛ්යා නිරූපණය කරන්නේ රූපයේ අඩු සංඛ්යාත වෙනස්කම් වන අතර එය අපගේ ඇස් වඩාත් හොඳින් තෝරා ගනී. අවසානය දක්වා ඇති සංඛ්යා පෙන්නුම් කරන්නේ දැකීමට වඩා අපහසු ඉහළ සංඛ්යාතවල වෙනස්කම් ය. "ඇසට නොපෙනෙන දේ දැකීමට", අපට පළමු අංක 5000 ශුන්ය කිරීමෙන් මෙම ඉහළ සංඛ්යාත විස්තර වෙන්කර හඳුනාගත හැකිය.
පික්සලයේ සිට පික්සල දක්වා විශාලම වෙනසක් සිදුවන රූපයේ සියලුම ප්රදේශ අපට පෙනේ. බළලුන්ගේ ඇස්, උඩු රැවුල, ටෙරී බ්ලැන්කට්ටුව සහ පහළ වම් කෙළවරේ සෙවනැලි කැපී පෙනේ. පළමු අංක 10 ශුන්ය කිරීමෙන් ඔබට තවත් ඉදිරියට යා හැක:
20 000:
40 000:
60 000:
මෙම අධි-සංඛ්යාත විස්තර JPEG මගින් සම්පීඩන අවධියේදී ඉවත් කරනු ලැබේ. DCT සංගුණක වලට වර්ණ පරිවර්තනය කිරීමේ පාඩුවක් නැත. අධි-සංඛ්යාත හෝ ශුන්යයට ආසන්න අගයන් ඉවත් කරන නියැදි පියවරේදී පාඩුව සිදුවේ. ඔබ JPEG සුරැකීමේ ගුණය අඩු කරන විට, වැඩසටහන ඉවත් කරන ලද අගයන් ගණන සඳහා එළිපත්ත වැඩි කරයි, එය ගොනු ප්රමාණය අඩු කරයි, නමුත් පින්තූරය වඩාත් පික්සලීකරණය කරයි. 57 ගුණයකින් කුඩා වූ පළමු කොටසේ රූපය මෙලෙස දිස් වූයේ එබැවිනි. සෑම 8x8 බ්ලොක් එකක්ම උසස් තත්ත්වයේ අනුවාදයට සාපේක්ෂව ඉතා අඩු DCT සංගුණක වලින් නියෝජනය විය.
රූප ක්රමයෙන් ප්රවාහය කිරීම වැනි සිසිල් බලපෑමක් ඔබට නිර්මාණය කළ හැකිය. වැඩි වැඩියෙන් සංගුණක බාගත වන විට ඔබට බොඳ පින්තූරයක් පෙන්විය හැක.
මෙන්න, හුදෙක් විනෝදය සඳහා, ඔබ හුදෙක් අංක 24 භාවිතා කරන්නේ කුමක් ද යන්නයි:
හෝ 5000 ක් පමණි:
ඉතා නොපැහැදිලි, නමුත් කෙසේ හෝ හඳුනාගත හැකිය!
3. ධාවන දිග කේතනය, ඩෙල්ටා සහ හෆ්මන්
මේ දක්වා, සම්පීඩනයේ සියලුම අදියරයන් අහිමි වී ඇත. අවසාන අදියර, ඊට පටහැනිව, පාඩු නොමැතිව ඉදිරියට යයි. එය තොරතුරු මකා නොදමනු ඇත, නමුත් එය ගොනු ප්රමාණය සැලකිය යුතු ලෙස අඩු කරයි.
තොරතුරු ඉවත නොදමා යමක් සම්පීඩනය කරන්නේ කෙසේද? අපි සරල කළු සෘජුකෝණාස්රයක් 700 x 437 විස්තර කරන්නේ කෙසේදැයි සිතා බලන්න.
JPEG මේ සඳහා අංක 5000 භාවිතා කරයි, නමුත් වඩා හොඳ ප්රතිඵල ලබා ගත හැකිය. එවැනි රූපයක් හැකි තරම් බයිට් කිහිපයකින් විස්තර කරන කේතීකරණ ක්රමයක් ඔබට සිතාගත හැකිද?
මට ඉදිරිපත් කළ හැකි අවම යෝජනා ක්රමය හතරක් භාවිතා කරයි: තුනක් වර්ණයක් නිරූපණය කිරීමට සහ හතරවැන්න එම වර්ණයට පික්සල කීයක් තිබේද යන්න දැක්වීමට. මෙම ඝනීභවනය වූ ආකාරයෙන් පුනරාවර්තන අගයන් නියෝජනය කිරීමේ අදහස ධාවන-දිග කේතනය ලෙස හැඳින්වේ. අපට කේතනය කළ දත්ත එහි මුල් ස්වරූපයට ප්රතිසාධනය කළ හැකි නිසා එය පාඩු රහිත ය.
කළු සෘජුකෝණාස්රයක් සහිත JPEG ගොනුවක් බයිට් 4 ට වඩා විශාල වේ - DCT මට්ටමේ දී, සම්පීඩනය 8x8 පික්සල් බ්ලොක් වලට යොදන බව මතක තබා ගන්න. එබැවින්, අවම වශයෙන්, සෑම පික්සල 64 කටම එක් DCT සංගුණකය අවශ්ය වේ. අපට එකක් අවශ්ය වන්නේ එක් DCT සංගුණකයක් පසුව ශුන්ය 63කින් පසුව ගබඩා කිරීම වෙනුවට ධාවන දිග කේතනය මඟින් අපට එක් අංකයක් ගබඩා කර “අනෙක් සියල්ල ශුන්ය” බව දැක්වීමට ඉඩ සලසයි.
ඩෙල්ටා කේතනය යනු සෑම බයිටයක්ම නිරපේක්ෂ අගයකට වඩා යම් අගයකින් වෙනසක් අඩංගු වන තාක්ෂණයකි. එමනිසා, ඇතැම් බයිට් සංස්කරණය කිරීමෙන් අනෙකුත් සියලුම පික්සලවල වර්ණය වෙනස් වේ. උදාහරණයක් ලෙස, ගබඩා කිරීම වෙනුවට
12 13 14 14 14 13 13 14
අපට 12 න් ආරම්භ කර ඊළඟ අංකය ලබා ගැනීමට කොපමණ එකතු කිරීමට හෝ අඩු කිරීමට අවශ්යදැයි සරලව සඳහන් කළ හැකිය. ඩෙල්ටා කේතීකරණයේ මෙම අනුපිළිවෙල ස්වරූපය ගනී:
12 1 1 0 0 -1 0 1
පරිවර්තනය කරන ලද දත්ත මුල් දත්ත වලට වඩා කුඩා නොවේ, නමුත් එය සම්පීඩනය කිරීම පහසුය. ධාවන දිග කේතනය කිරීමට පෙර ඩෙල්ටා කේතනය යෙදීම පාඩු රහිත සම්පීඩනය වන අතරම බොහෝ සෙයින් උපකාරී වේ.
ඩෙල්ටා කේතීකරණය 8x8 බ්ලොක් වලින් පිටත භාවිතා කරන තාක්ෂණික ක්රම කිහිපයෙන් එකකි. DCT සංගුණක 64 න් එකක් සරලව නියත තරංග ශ්රිතයකි (ඝන වර්ණය). එය ලුමා සංරචක සඳහා එක් එක් බ්ලොක් වල සාමාන්ය දීප්තිය හෝ Cb සංරචක සඳහා සාමාන්ය නිල් පැහැය සහ යනාදිය නියෝජනය කරයි. එක් එක් DCT බ්ලොක් එකේ පළමු අගය DC අගය ලෙස හඳුන්වනු ලබන අතර, සෑම DC අගයක්ම පෙර අගයට සාපේක්ෂව ඩෙල්ටා කේතනය කර ඇත. එමනිසා, පළමු බ්ලොක් එකේ දීප්තිය වෙනස් කිරීම සියලු බ්ලොක් වලට බලපානු ඇත.
අවසාන අභිරහස ඉතිරිව පවතී: ඒකවචනය වෙනස් කිරීම මුළු පින්තූරයම සම්පූර්ණයෙන්ම විනාශ කරන්නේ කෙසේද? මේ දක්වා, සම්පීඩන මට්ටම් එවැනි ගුණාංග නොතිබුණි. පිළිතුර JPEG ශීර්ෂයේ ඇත. පළමු බයිට් 500 තුළ රූපය පිළිබඳ පාර-දත්ත අඩංගු වේ - පළල, උස, යනාදිය, අපි තවමත් ඒවා සමඟ වැඩ කර නැත.
ශීර්ෂයක් නොමැතිව JPEG විකේතනය කිරීම පාහේ කළ නොහැක්කකි (හෝ ඉතා අපහසුය). මම ඔබට පින්තූරය විස්තර කිරීමට උත්සාහ කරන බවක් පෙනෙනු ඇත, මම මගේ හැඟීම ප්රකාශ කිරීම සඳහා වචන නිර්මාණය කිරීමට පටන් ගනිමි. විස්තරය බොහෝ දුරට ඝනීභවනය වනු ඇත, මන්ද මට ප්රකාශ කිරීමට අවශ්ය හරියටම අර්ථය සහිත වචන නිර්මාණය කළ හැකි නමුත් අනෙක් සියල්ලන්ටම ඒවා අර්ථවත් නොවනු ඇත.
එය මෝඩකමක් ලෙස පෙනේ, නමුත් එය හරියටම සිදු වේ. සෑම JPEG රූපයක්ම එයට විශේෂිත වූ කේත සමඟ සම්පීඩිත වේ. කේත ශබ්දකෝෂය ශීර්ෂයේ ගබඩා කර ඇත. මෙම තාක්ෂණය හෆ්මන් කේතය ලෙසත් වචන මාලාව හෆ්මන් වගුව ලෙසත් හැඳින්වේ. ශීර්ෂයේ, වගුව බයිට් දෙකකින් සලකුණු කර ඇත - 255 සහ පසුව 196. සෑම වර්ණ සංරචකයකටම තමන්ගේම වගුවක් තිබිය හැකිය.
වගු වෙනස් කිරීම ඕනෑම රූපයකට රැඩිකල් ලෙස බලපානු ඇත. හොඳ උදාහරණයක් වන්නේ 15 වන පේළිය 1 ට වෙනස් කිරීමයි.
මෙය සිදු වන්නේ වගු තනි බිටු කියවිය යුතු ආකාරය සඳහන් කරන බැවිනි. අපි මෙතෙක් වැඩ කර ඇත්තේ දශම ආකාරයෙන් ද්විමය සංඛ්යා සමඟ පමණි. නමුත් මෙමගින් ඔබට බයිට් එකක අංක 1 ගබඩා කිරීමට අවශ්ය නම් එය 00000001 ලෙස පෙනෙනු ඇති බව අපෙන් සඟවයි, මන්ද සෑම බයිටයකටම හරියටම බිට් අටක් තිබිය යුතුය, ඒවායින් එකක් පමණක් අවශ්ය වුවද.
ඔබට කුඩා සංඛ්යා ගොඩක් තිබේ නම් මෙය විශාල ඉඩ නාස්තියක් විය හැකිය. හෆ්මන් කේතය යනු සෑම අංකයක්ම බිටු අටක් තිබිය යුතු මෙම අවශ්යතාවය ලිහිල් කිරීමට අපට ඉඩ සලසන තාක්ෂණයකි. මෙයින් අදහස් කරන්නේ ඔබ බයිට් දෙකක් දුටුවහොත්:
234 115
එවිට, හෆ්මන් වගුව අනුව, මේවා අංක තුනක් විය හැකිය. ඒවා උකහා ගැනීම සඳහා, ඔබ මුලින්ම ඒවා තනි බිටු වලට බෙදිය යුතුය:
11101010 01110011
ඉන්පසුව අපි ඒවා කාණ්ඩගත කරන්නේ කෙසේදැයි සොයා බැලීමට මේසය දෙස බලමු. උදාහරණයක් ලෙස, මෙය පළමු බිටු හය, (111010), හෝ දශමයෙන් 58, පසුව බිටු පහ (10011), හෝ 19, සහ අවසානයේ අවසාන බිටු හතර (0011) හෝ 3 විය හැකිය.
එබැවින්, සම්පීඩනය කිරීමේ මෙම අදියරේදී බයිට් තේරුම් ගැනීම ඉතා අපහසු වේ. බයිට් ඒවා පෙනෙන දේ නියෝජනය නොකරයි. මම මෙම ලිපියේ වගුව සමඟ වැඩ කිරීම පිළිබඳ විස්තර වෙත නොයමි, නමුත්
මෙම දැනුමෙන් ඔබට කළ හැකි එක් රසවත් උපක්රමයක් නම් JPEG වෙතින් ශීර්ෂකය වෙන් කර එය වෙන වෙනම ගබඩා කිරීමයි. ඇත්ත වශයෙන්ම, ගොනුව කියවිය හැක්කේ ඔබට පමණක් බව පෙනී යයි. ෆේස්බුක් මෙය කරන්නේ ගොනු තවත් කුඩා කිරීමටයි.
තව කරන්න පුළුවන් Huffman table එක ටිකක් වෙනස් කරන එක. අනෙක් අයට එය කැඩුණු පින්තූරයක් ලෙස පෙනෙනු ඇත. එය නිවැරදි කිරීමට මායාකාරී මාර්ගය දන්නේ ඔබ පමණි.
අපි සාරාංශ කරමු: එසේ නම් JPEG විකේතනය කිරීමට අවශ්ය වන්නේ කුමක්ද? අවශ්ය:
- ශීර්ෂයෙන් හෆ්මන් වගුව(ය) උපුටාගෙන බිටු විකේතනය කරන්න.
- ප්රතිලෝම ධාවන-දිග සහ ඩෙල්ටා කේතීකරණ පරිවර්තන සිදු කරමින්, එක් එක් 8x8 බ්ලොක් සඳහා එක් එක් වර්ණ සහ දීප්ති සංරචක සඳහා විවික්ත කෝසයින පරිවර්තන සංගුණක නිස්සාරණය කරන්න.
- එක් එක් 8x8 වාරණ සඳහා පික්සල් අගයන් ලබා ගැනීම සඳහා සංගුණක මත පදනම් වූ කොසයින ඒකාබද්ධ කරන්න.
- උප නියැදීම සිදු කළේ නම් වර්ණ සංරචක පරිමාණය කරන්න (මෙම තොරතුරු ශීර්ෂයේ ඇත).
- එක් එක් පික්සලය සඳහා ලැබෙන YCbCr අගයන් RGB බවට පරිවර්තනය කරන්න.
- රූපය තිරය මත පෙන්වන්න!
බළලෙකු සමඟ ඡායාරූපයක් බැලීම සඳහා බරපතල වැඩ! කෙසේ වෙතත්, මම ඒ ගැන කැමති වන්නේ එය මානව කේන්ද්රීය JPEG තාක්ෂණය කෙතරම්ද යන්න පෙන්නුම් කිරීමයි. එය අපගේ සංජානනයේ සුවිශේෂතා මත පදනම් වී ඇති අතර, සාම්ප්රදායික තාක්ෂණයන්ට වඩා හොඳ සම්පීඩනයක් ලබා ගැනීමට අපට ඉඩ සලසයි. JPEG ක්රියා කරන ආකාරය දැන් අපට වැටහෙන විට, මෙම තාක්ෂණයන් වෙනත් ප්රදේශවලට මාරු කරන්නේ කෙසේදැයි අපට සිතාගත හැකිය. උදාහරණයක් ලෙස, වීඩියෝවල ඩෙල්ටා කේතනය මඟින් ගොනු ප්රමාණයෙහි සැලකිය යුතු අඩුවීමක් ලබා දිය හැක, මන්දයත් බොහෝ විට රාමුවෙන් රාමුවට වෙනස් නොවන සම්පූර්ණ ප්රදේශ ඇති බැවින් (උදාහරණයක් ලෙස, පසුබිම).
මූලාශ්රය: www.habr.com