45 lines
45 KiB
HTML
45 lines
45 KiB
HTML
<!doctype html>
|
||
<html lang="zh-CN">
|
||
<head>
|
||
<meta charset="utf-8" />
|
||
<meta name="viewport" content="width=device-width,initial-scale=1" />
|
||
<meta name="generator" content="VuePress 2.0.0-rc.19" />
|
||
<style>
|
||
:root {
|
||
--vp-c-bg: #fff;
|
||
}
|
||
|
||
[data-theme='dark'] {
|
||
--vp-c-bg: #1b1b1f;
|
||
}
|
||
|
||
html,
|
||
body {
|
||
background-color: var(--vp-c-bg);
|
||
}
|
||
</style>
|
||
<script>
|
||
const useChoice = localStorage.getItem('vuepress-color-scheme')
|
||
const systemStatus =
|
||
'matchMedia' in window
|
||
? window.matchMedia('(prefers-color-scheme: dark)').matches
|
||
: false
|
||
|
||
if (useChoice === 'light') {
|
||
document.documentElement.dataset.theme = 'light'
|
||
} else if (useChoice === 'dark' || systemStatus) {
|
||
document.documentElement.dataset.theme = 'dark'
|
||
}
|
||
</script>
|
||
<link rel="icon" href="favicon.png"><title>JPEG算法解密(四) | 我的博客和笔记</title><meta name="description" content="理性派,数学,物理,程序">
|
||
<link rel="preload" href="/assets/style-BeRIA1J-.css" as="style"><link rel="stylesheet" href="/assets/style-BeRIA1J-.css">
|
||
<link rel="modulepreload" href="/assets/app-CBOiqV2i.js"><link rel="modulepreload" href="/assets/JPEG004.html-BpvwrgYX.js">
|
||
<link rel="prefetch" href="/assets/about.html-CaCRgfd4.js" as="script"><link rel="prefetch" href="/assets/index.html-BnOhmHX0.js" as="script"><link rel="prefetch" href="/assets/index.html-C0tp0HQZ.js" as="script"><link rel="prefetch" href="/assets/index.html-BVjtOtLU.js" as="script"><link rel="prefetch" href="/assets/flip_coin.html-CbgDM0WC.js" as="script"><link rel="prefetch" href="/assets/index.html-CfMm_lA8.js" as="script"><link rel="prefetch" href="/assets/mental_poker.html-D-MkRjcd.js" as="script"><link rel="prefetch" href="/assets/rsa.html-CVcSHRfS.js" as="script"><link rel="prefetch" href="/assets/index.html-Cki9uH7s.js" as="script"><link rel="prefetch" href="/assets/index.html-DYry7oJe.js" as="script"><link rel="prefetch" href="/assets/group.html-Blubyy1D.js" as="script"><link rel="prefetch" href="/assets/index.html-KmyIJlXN.js" as="script"><link rel="prefetch" href="/assets/number_theory_1.html-B1aNMMbd.js" as="script"><link rel="prefetch" href="/assets/number_theory_2.html-DXjPYAOh.js" as="script"><link rel="prefetch" href="/assets/number_theory_3.html-BH2WbXF_.js" as="script"><link rel="prefetch" href="/assets/probability.html-BFSdoHzA.js" as="script"><link rel="prefetch" href="/assets/symbol.html-BRzFB_KP.js" as="script"><link rel="prefetch" href="/assets/DH.html-C3jU6zeQ.js" as="script"><link rel="prefetch" href="/assets/Ellipse.html-D7sDMIW5.js" as="script"><link rel="prefetch" href="/assets/Fibonacci.html-ByrsOyCH.js" as="script"><link rel="prefetch" href="/assets/JPEG001.html-ZuJpzikG.js" as="script"><link rel="prefetch" href="/assets/JPEG002.html-BNJM6lSf.js" as="script"><link rel="prefetch" href="/assets/JPEG003.html-DqKj1uCw.js" as="script"><link rel="prefetch" href="/assets/JPEG005.html-BhyNx4ch.js" as="script"><link rel="prefetch" href="/assets/Martingle.html-BcQmvYho.js" as="script"><link rel="prefetch" href="/assets/MentalPoker01.html-BQyDLi0z.js" as="script"><link rel="prefetch" href="/assets/MentalPoker02.html-CoPNsKV8.js" as="script"><link rel="prefetch" href="/assets/RandRound.html-DJ6F5fE-.js" as="script"><link rel="prefetch" href="/assets/SPH001.html-79Z2Vgx0.js" as="script"><link rel="prefetch" href="/assets/SPH002.html-Ctwtmflg.js" as="script"><link rel="prefetch" href="/assets/SPH003.html-B4G1f4aT.js" as="script"><link rel="prefetch" href="/assets/SPH004.html-R_jEP5EL.js" as="script"><link rel="prefetch" href="/assets/SegmentCircle.html-CLl34xc5.js" as="script"><link rel="prefetch" href="/assets/BezierLine01.html-C5lugmYi.js" as="script"><link rel="prefetch" href="/assets/BezierLine02.html-DB-bWzHF.js" as="script"><link rel="prefetch" href="/assets/index.html-D-dWNmd6.js" as="script"><link rel="prefetch" href="/assets/ibl_01.html-Berc-6tA.js" as="script"><link rel="prefetch" href="/assets/ibl_02.html-BtAPQych.js" as="script"><link rel="prefetch" href="/assets/index.html-idMuDBIk.js" as="script"><link rel="prefetch" href="/assets/index.html-wHyIQDet.js" as="script"><link rel="prefetch" href="/assets/math_01.html-Ck2811N3.js" as="script"><link rel="prefetch" href="/assets/math_02.html-B1k04DnP.js" as="script"><link rel="prefetch" href="/assets/math_03.html-D1u4_nDT.js" as="script"><link rel="prefetch" href="/assets/transform_01.html-Bgql5csh.js" as="script"><link rel="prefetch" href="/assets/transform_02.html-BDHXswhj.js" as="script"><link rel="prefetch" href="/assets/transform_03.html-BnnEu_9h.js" as="script"><link rel="prefetch" href="/assets/transform_04.html-DylfftlJ.js" as="script"><link rel="prefetch" href="/assets/function.html-DkoRzIhQ.js" as="script"><link rel="prefetch" href="/assets/grammar.html-BY3WjPfm.js" as="script"><link rel="prefetch" href="/assets/helloworld.html-2VrLbE34.js" as="script"><link rel="prefetch" href="/assets/index.html-DizodJ7B.js" as="script"><link rel="prefetch" href="/assets/object_and_class.html-CUoMR8vO.js" as="script"><link rel="prefetch" href="/assets/BRDF.html-CgpuVTB8.js" as="script"><link rel="prefetch" href="/assets/illumination_model_01.html-CjoiNhAi.js" as="script"><link rel="prefetch" href="/assets/luminosity.html-BNuRLk2_.js" as="script"><link rel="prefetch" href="/assets/microfacets_1.html-BackwOBg.js" as="script"><link rel="prefetch" href="/assets/microfacets_2.html-CvKaS_uK.js" as="script"><link rel="prefetch" href="/assets/microfacets_3.html-BbPXacLL.js" as="script"><link rel="prefetch" href="/assets/render_function_1.html-drEPcWRu.js" as="script"><link rel="prefetch" href="/assets/404.html-Ce5fuf8c.js" as="script"><link rel="prefetch" href="/assets/setupDevtools-7MC2TMWH-L9XiQ4bX.js" as="script">
|
||
</head>
|
||
<body>
|
||
<div id="app"><!--[--><div class="vp-theme-container external-link-icon" vp-container><!--[--><header class="vp-navbar" vp-navbar><div class="vp-toggle-sidebar-button" title="toggle sidebar" aria-expanded="false" role="button" tabindex="0"><div class="icon" aria-hidden="true"><span></span><span></span><span></span></div></div><span><a class="route-link" href="/"><img class="vp-site-logo" src="/favicon.png" alt="我的博客和笔记"><span class="vp-site-name vp-hide-mobile" aria-hidden="true">我的博客和笔记</span></a></span><div class="vp-navbar-items-wrapper" style=""><!--[--><!--]--><nav class="vp-navbar-items vp-hide-mobile" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/blog/" aria-label="文章"><!--[--><!--[--><!--]--><!--]-->文章<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/TinyEncrypt" aria-label="TinyEncrypt" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TinyEncrypt<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/ue5-style-guide" aria-label="UnrealStyleGuide" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->UnrealStyleGuide<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/AxTrace" aria-label="AxTrace" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->AxTrace<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/cyclone" aria-label="Cyclone" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Cyclone<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/math/" aria-label="数学相关"><!--[--><!--[--><!--]--><!--]-->数学相关<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/graphics/" aria-label="图形学"><!--[--><!--[--><!--]--><!--]-->图形学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/cryptography/" aria-label="密码学"><!--[--><!--[--><!--]--><!--]-->密码学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/language/" aria-label="编程语言"><!--[--><!--[--><!--]--><!--]-->编程语言<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/about.html" aria-label="关于"><!--[--><!--[--><!--]--><!--]-->关于<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/thejinchao/thejinchao.github.io" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><button type="button" class="vp-toggle-color-mode-button" title="toggle color mode"><svg class="light-icon" viewbox="0 0 32 32" style=""><path d="M16 12.005a4 4 0 1 1-4 4a4.005 4.005 0 0 1 4-4m0-2a6 6 0 1 0 6 6a6 6 0 0 0-6-6z" fill="currentColor"></path><path d="M5.394 6.813l1.414-1.415l3.506 3.506L8.9 10.318z" fill="currentColor"></path><path d="M2 15.005h5v2H2z" fill="currentColor"></path><path d="M5.394 25.197L8.9 21.691l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 25.005h2v5h-2z" fill="currentColor"></path><path d="M21.687 23.106l1.414-1.415l3.506 3.506l-1.414 1.414z" fill="currentColor"></path><path d="M25 15.005h5v2h-5z" fill="currentColor"></path><path d="M21.687 8.904l3.506-3.506l1.414 1.415l-3.506 3.505z" fill="currentColor"></path><path d="M15 2.005h2v5h-2z" fill="currentColor"></path></svg><svg class="dark-icon" viewbox="0 0 32 32" style="display:none;"><path d="M13.502 5.414a15.075 15.075 0 0 0 11.594 18.194a11.113 11.113 0 0 1-7.975 3.39c-.138 0-.278.005-.418 0a11.094 11.094 0 0 1-3.2-21.584M14.98 3a1.002 1.002 0 0 0-.175.016a13.096 13.096 0 0 0 1.825 25.981c.164.006.328 0 .49 0a13.072 13.072 0 0 0 10.703-5.555a1.01 1.01 0 0 0-.783-1.565A13.08 13.08 0 0 1 15.89 4.38A1.015 1.015 0 0 0 14.98 3z" fill="currentColor"></path></svg></button><!----></div></header><!--]--><div class="vp-sidebar-mask"></div><!--[--><aside class="vp-sidebar" vp-sidebar><nav class="vp-navbar-items" aria-label="site navigation"><!--[--><div class="vp-navbar-item"><a class="route-link auto-link" href="/" aria-label="首页"><!--[--><!--[--><!--]--><!--]-->首页<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="route-link route-link-active auto-link" href="/blog/" aria-label="文章"><!--[--><!--[--><!--]--><!--]-->文章<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="开源项目"><span class="title">开源项目</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/TinyEncrypt" aria-label="TinyEncrypt" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TinyEncrypt<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/ue5-style-guide" aria-label="UnrealStyleGuide" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->UnrealStyleGuide<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/AxTrace" aria-label="AxTrace" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->AxTrace<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="auto-link external-link" href="https://github.com/thejinchao/cyclone" aria-label="Cyclone" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Cyclone<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><div class="vp-navbar-dropdown-wrapper"><button class="vp-navbar-dropdown-title" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="arrow down"></span></button><button class="vp-navbar-dropdown-title-mobile" type="button" aria-label="个人笔记"><span class="title">个人笔记</span><span class="right arrow"></span></button><ul style="display:none;" class="vp-navbar-dropdown"><!--[--><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/math/" aria-label="数学相关"><!--[--><!--[--><!--]--><!--]-->数学相关<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/graphics/" aria-label="图形学"><!--[--><!--[--><!--]--><!--]-->图形学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/cryptography/" aria-label="密码学"><!--[--><!--[--><!--]--><!--]-->密码学<!--[--><!--[--><!--]--><!--]--></a></li><li class="vp-navbar-dropdown-item"><a class="route-link auto-link" href="/note/language/" aria-label="编程语言"><!--[--><!--[--><!--]--><!--]-->编程语言<!--[--><!--[--><!--]--><!--]--></a></li><!--]--></ul></div></div><div class="vp-navbar-item"><a class="route-link auto-link" href="/about.html" aria-label="关于"><!--[--><!--[--><!--]--><!--]-->关于<!--[--><!--[--><!--]--><!--]--></a></div><div class="vp-navbar-item"><a class="auto-link external-link" href="https://github.com/thejinchao/thejinchao.github.io" aria-label="GitHub" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->GitHub<!--[--><!--[--><!--]--><!--]--></a></div><!--]--></nav><!--[--><!--]--><ul class="vp-sidebar-items"><!--[--><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading active collapsible">我的文章 <span class="down arrow"></span></p><ul style="" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">从抛币协议到智能合约 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/MentalPoker01.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/MentalPoker02.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item active collapsible">JPEG算法解密 <span class="down arrow"></span></p><ul style="" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG001.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG002.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG003.html" aria-label="Part3"><!--[--><!--[--><!--]--><!--]-->Part3<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link route-link-active auto-link vp-sidebar-item active" href="/blog/2025/02/JPEG004.html" aria-label="Part4"><!--[--><!--[--><!--]--><!--]-->Part4<!--[--><!--[--><!--]--><!--]--></a><ul style="" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="#步骤五-哈弗曼编码" aria-label="步骤五:哈弗曼编码"><!--[--><!--[--><!--]--><!--]-->步骤五:哈弗曼编码<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/JPEG005.html" aria-label="Part5"><!--[--><!--[--><!--]--><!--]-->Part5<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="http://github.com/thejinchao/jpeg_encoder" aria-label="Github" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Github<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">SPH算法简介 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH001.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH002.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH003.html" aria-label="Part3"><!--[--><!--[--><!--]--><!--]-->Part3<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SPH004.html" aria-label="Part4"><!--[--><!--[--><!--]--><!--]-->Part4<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/fluid" aria-label="Github" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Github<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Martingle.html" aria-label="赌博中的数学:Martingle策略"><!--[--><!--[--><!--]--><!--]-->赌博中的数学:Martingle策略<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/RandRound.html" aria-label="如何生成一个随机的圆形"><!--[--><!--[--><!--]--><!--]-->如何生成一个随机的圆形<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/DH.html" aria-label="一个简单的DH密钥协商算法的实现"><!--[--><!--[--><!--]--><!--]-->一个简单的DH密钥协商算法的实现<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/SegmentCircle.html" aria-label="如何计算线段和圆的交点"><!--[--><!--[--><!--]--><!--]-->如何计算线段和圆的交点<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Ellipse.html" aria-label="一道数学趣题"><!--[--><!--[--><!--]--><!--]-->一道数学趣题<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/02/Fibonacci.html" aria-label="斐波那契数列和1/89"><!--[--><!--[--><!--]--><!--]-->斐波那契数列和1/89<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><p tabindex="0" class="vp-sidebar-item collapsible">匀速贝塞尔曲线运动的实现 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/03/BezierLine01.html" aria-label="Part1"><!--[--><!--[--><!--]--><!--]-->Part1<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/blog/2025/03/BezierLine02.html" aria-label="Part2"><!--[--><!--[--><!--]--><!--]-->Part2<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading collapsible">开源项目 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/turbolink" aria-label="TurboLink" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TurboLink<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/TinyEncrypt" aria-label="TinyEncrypt" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->TinyEncrypt<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/ue5-style-guide" aria-label="UnrealStyleGuide" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->UnrealStyleGuide<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/AxTrace" aria-label="AxTrace" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->AxTrace<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="auto-link external-link vp-sidebar-item" href="https://github.com/thejinchao/cyclone" aria-label="Cyclone" rel="noopener noreferrer" target="_blank"><!--[--><!--[--><!--]--><!--]-->Cyclone<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item vp-sidebar-heading collapsible">学习笔记 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">数学相关 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/symbol.html" aria-label="常用数学符号"><!--[--><!--[--><!--]--><!--]-->常用数学符号<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/group.html" aria-label="群"><!--[--><!--[--><!--]--><!--]-->群<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_1.html" aria-label="数论(一)"><!--[--><!--[--><!--]--><!--]-->数论(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_2.html" aria-label="数论(二)"><!--[--><!--[--><!--]--><!--]-->数论(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/number_theory_3.html" aria-label="数论(三)"><!--[--><!--[--><!--]--><!--]-->数论(三)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/math/probability.html" aria-label="概率"><!--[--><!--[--><!--]--><!--]-->概率<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">密码学 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/rsa.html" aria-label="RSA"><!--[--><!--[--><!--]--><!--]-->RSA<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/flip_coin.html" aria-label="抛币协议"><!--[--><!--[--><!--]--><!--]-->抛币协议<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/cryptography/mental_poker.html" aria-label="智能扑克协议"><!--[--><!--[--><!--]--><!--]-->智能扑克协议<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">图形学 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">数学基础 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_01.html" aria-label="矢量"><!--[--><!--[--><!--]--><!--]-->矢量<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_02.html" aria-label="矩阵"><!--[--><!--[--><!--]--><!--]-->矩阵<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/math_03.html" aria-label="立体角"><!--[--><!--[--><!--]--><!--]-->立体角<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_01.html" aria-label="几何变换(一)"><!--[--><!--[--><!--]--><!--]-->几何变换(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_02.html" aria-label="几何变换(二)"><!--[--><!--[--><!--]--><!--]-->几何变换(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_03.html" aria-label="法线变换"><!--[--><!--[--><!--]--><!--]-->法线变换<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/math/transform_04.html" aria-label="摄像机变换"><!--[--><!--[--><!--]--><!--]-->摄像机变换<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">光照模型 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/classic/illumination_model_01.html" aria-label="传统光照模型"><!--[--><!--[--><!--]--><!--]-->传统光照模型<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/luminosity/luminosity.html" aria-label="光度学"><!--[--><!--[--><!--]--><!--]-->光度学<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/BRDF/BRDF.html" aria-label="双向反射分布函数(BRDF)"><!--[--><!--[--><!--]--><!--]-->双向反射分布函数(BRDF)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_1.html" aria-label="微平面理论(一)"><!--[--><!--[--><!--]--><!--]-->微平面理论(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_2.html" aria-label="微平面理论(二)"><!--[--><!--[--><!--]--><!--]-->微平面理论(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/microfacets/microfacets_3.html" aria-label="微平面理论(三)"><!--[--><!--[--><!--]--><!--]-->微平面理论(三)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/illumination_model/render_function/render_function_1.html" aria-label="光照方程"><!--[--><!--[--><!--]--><!--]-->光照方程<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">环境光渲染 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/image_based_lighting/ibl_01.html" aria-label="环境光渲染(一)"><!--[--><!--[--><!--]--><!--]-->环境光渲染(一)<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/graphics/image_based_lighting/ibl_02.html" aria-label="环境光渲染(二)"><!--[--><!--[--><!--]--><!--]-->环境光渲染(二)<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><li><p tabindex="0" class="vp-sidebar-item collapsible">编程语言 <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><p tabindex="0" class="vp-sidebar-item collapsible">JavaScript <span class="right arrow"></span></p><ul style="display:none;" class="vp-sidebar-children"><!--[--><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/helloworld.html" aria-label="环境搭建"><!--[--><!--[--><!--]--><!--]-->环境搭建<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/grammar.html" aria-label="基本语法"><!--[--><!--[--><!--]--><!--]-->基本语法<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/function.html" aria-label="函数"><!--[--><!--[--><!--]--><!--]-->函数<!--[--><!--[--><!--]--><!--]--></a><!----></li><li><a class="route-link auto-link vp-sidebar-item" href="/note/language/javascript/object_and_class.html" aria-label="对象和类"><!--[--><!--[--><!--]--><!--]-->对象和类<!--[--><!--[--><!--]--><!--]--></a><!----></li><!--]--></ul></li><!--]--></ul></li><!--]--></ul></li><!--]--></ul><!--[--><!--]--></aside><!--]--><!--[--><main class="vp-page"><!--[--><!--]--><div vp-content><!--[--><!--]--><div><h1 id="jpeg算法解密-四" tabindex="-1"><a class="header-anchor" href="#jpeg算法解密-四"><span>JPEG算法解密(四)</span></a></h1><h3 id="步骤五-哈弗曼编码" tabindex="-1"><a class="header-anchor" href="#步骤五-哈弗曼编码"><span>步骤五:哈弗曼编码</span></a></h3><hr><p>JPEG压缩的最后一步是对数据进行哈弗曼编码(Huffman coding),哈弗曼几乎是所有压缩算法的基础,它的基本原理是根据数据中元素的使用频率,调整元素的编码长度,以得到更高的压缩比。<br> 举个例子,比如下面这段数据</p><div class="language-text" data-highlighter="prismjs" data-ext="text" data-title="text"><pre><code><span class="line">AABCBABBCDBBDDBAABDBBDABBBBDDEDBD</span>
|
||
<span class="line"></span></code></pre></div><p>这段数据里面包含了33个字符,每种字符出现的次数统计如下</p><table class="gridtable" style="width:400px;text-align:center;border-collapse:collapse;"><tbody><tr><th style="width:100px;">字符</th><td style="width:60px;">A</td><td style="width:60px;">B</td><td style="width:60px;">C</td><td style="width:60px;">D</td><td style="width:60px;">E</td></tr><tr><th>次数</th><td>6</td><td>15</td><td>2</td><td>9</td><td>1</td></tr></tbody></table> 如果我们用我们常见的定长编码,每个字符都是3个bit。 <table class="gridtable" style="width:400px;text-align:center;border-collapse:collapse;"><tbody><tr><th style="width:100px;">字符</th><td style="width:60px;">A</td><td style="width:60px;">B</td><td style="width:60px;">C</td><td style="width:60px;">D</td><td style="width:60px;">E</td></tr><tr><th>编码</th><td>001</td><td>010</td><td>011</td><td>100</td><td>101</td></tr></tbody></table><p>那么这段文字共需要<code>3*33=99</code>个bit来保存,但如果我们根据字符出现的概率来编码,也就是出现频率较高的字符,使用较短的编码,如下:</p><table class="gridtable" style="width:400px;text-align:center;border-collapse:collapse;"><tbody><tr><th style="width:100px;">字符</th><td style="width:60px;">A</td><td style="width:60px;">B</td><td style="width:60px;">C</td><td style="width:60px;">D</td><td style="width:60px;">E</td></tr><tr><th>编码</th><td>110</td><td>0</td><td>1110</td><td>10</td><td>1111</td></tr></tbody></table><p>那么这段文字共需要<code>3*6+1*15+4*2+2*9+4*1=63</code>个bit来保存,压缩比为63%,哈弗曼编码一般都是使用二叉树来生成的,这样得到的编码符合前缀规则,也就是较短的编码不能够是较长编码的前缀,比如字符'B'使用的编码是'0',那么其他字符的编码的第一个字符都不能是‘0’。<br> 上面这个编码实例,就是由下面的这颗二叉树生成的。</p><figure><img src="/images/2014/08/hufman7.gif" alt="" tabindex="0" loading="lazy"><figcaption></figcaption></figure><p>我们回到JPEG压缩上,回顾上一节的内容,经过数据量化,我们现在要处理的数据是一串一维数组,举例如下:</p><table class="gridtable" style="width:600px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:500px;"><!----></td></tr></tbody></table> 在实际的压缩过程中,数据中的0出现的概率非常高,所以首先要做的事情,是使用RLE编码对其中的0进行处理,把数据中的非零的数据,以及数据前面0的个数作为一个处理单元。 <table class="gridtable" align="center" style="width:600px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:500px;" colspan="8"><!----></td></tr><tr><th style="text-align:left;"><strong>②RLE编码</strong></th><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td>0,0,…,0,8</td><td>0,0,…,0</td></tr></tbody></table> 如果其中某个单元的0的个数超过16,则需要分成每16个一组,如果最后一个单元全都是0,则使用特殊字符“EOB”表示,EOB意思就是“后面的数据全都是0”, <table class="gridtable" align="center" style="width:600px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:500px;" colspan="8"><!----></td></tr><tr><th style="text-align:left;" rowspan="3"><strong>②RLE编码</strong></th><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td colspan="2">0,0,…,0,8</td><td>0,0,…,0</td></tr><tr><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td>0,0,…,0</td><td>0,0,8</td><td>0,0,…,0</td></tr><tr><td>(0,35)</td><td>(0,7)</td><td>(3,-6)</td><td>(0,-2)</td><td>(2,-9)</td><td>(15,0)</td><td>(2,8)</td><td>EOB</td></tr></tbody></table> 其中(15,0)表示15+1也就是16个0,接下来我们要处理的是括号里右面的数字,这个数字的取值范围在-2047~2047之间,JPEG提供了一张标准的码表用于对这些数字编码: <table class="gridtable" style="width:550px;text-align:center;"><tbody><tr><th style="width:250px;" colspan="2">Value</th><th style="width:50px;">Size</th><th style="width:250px;" colspan="2">Bits </th></tr><tr><td align="center" colspan="2">0</td><td>0</td><td align="center" colspan="2">–</td></tr><tr><td align="right">-1</td><td align="left">1</td><td>1</td><td align="right">0</td><td align="left">1</td></tr><tr><td align="right">-3,-2</td><td align="left">2,3</td><td>2</td><td align="right">00,01</td><td align="left">10,11</td></tr><tr><td align="right">-7,-6,-5,-4</td><td align="left">4,5,6,7</td><td>3</td><td align="right">000,001,010,011</td><td align="left">100,101,110,111</td></tr><tr><td align="right">-15,…,-8</td><td align="left">8,…,15</td><td>4</td><td align="right">0000,…,0111</td><td align="left">1000,…,1111</td></tr><tr><td align="right">-31,…,-16</td><td align="left">16,…,31</td><td>5</td><td align="right">0 0000,…,0 1111</td><td align="left">1 0000,…,1 1111 </td></tr><tr><td align="right">-63,…,-32</td><td align="left">32,…,63</td><td>6</td><td align="right">00 0000,…</td><td align="left">…,11 1111 </td></tr><tr><td align="right">-127,…,-64</td><td align="left">64,…,127</td><td>7</td><td align="right">000 0000,…</td><td align="left">…,111 1111 </td></tr><tr><td align="right">-255,…,-128</td><td align="left">128,…,255</td><td>8</td><td align="right">0000 0000,…</td><td align="left">…,1111 1111 </td></tr><tr><td align="right">-511,…,-256</td><td align="left">256,…,511</td><td>9</td><td align="right">0 0000 0000,…</td><td align="left">…,1 1111 1111 </td></tr><tr><td align="right">-1023,…,-512</td><td align="left">512,…,1023</td><td>10</td><td align="right">00 0000 0000,…</td><td align="left">…,11 1111 1111 </td></tr><tr><td align="right">-2047,…,-1024</td><td align="left">1024,…,2047</td><td>11</td><td align="right">000 0000 0000,…</td><td align="left">…,111 1111 1111</td></tr></tbody></table> 举例来说,第一个单元中的“35”这个数字,在表中的位置是长度为6的那组,所对应的bit码是“100011”,而“-6”的编码是”001″,由于这种编码附带长度信息,所以我们的数据变成了如下的格式。 <table class="gridtable" align="center" style="width:800px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:700px;" colspan="8"><!----></td></tr><tr><th style="text-align:left;" rowspan="3"><strong>②RLE编码</strong></th><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td colspan="2">0,0,…,0,8</td><td>0,0,…,0</td></tr><tr style="padding:3px 3px;"><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td>0,0,…,0</td><td>0,0,8</td><td>0,0,…,0</td></tr><tr><td>(0,35)</td><td>(0,7)</td><td>(3,-6)</td><td>(0,-2)</td><td>(2,-9)</td><td>(15,0)</td><td>(2,8)</td><td>EOB</td></tr><tr><th style="text-align:left;"><strong>③BIT编码</strong></th><td>(0,6, <em><b>100011</b></em>)</td><td>(0,3, <em><b>111</b></em>)</td><td>(3,3, <em><b>001</b></em>)</td><td>(0,2, <em><b>01</b></em>)</td><td>(2,4, <em><b>0110</b></em>)</td><td>(15,-)</td><td>(2,4, <em><b>1000</b></em>)</td><td>EOB</td></tr></tbody></table> 括号中前两个数字分都在0~15之间,所以这两个数可以合并成一个byte,高四位是前面0的个数,后四位是后面数字的位数。 <table class="gridtable" align="center" style="width:800px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:700px;" colspan="8"><!----></td></tr><tr><th style="text-align:left;" rowspan="3"><strong>②RLE编码</strong></th><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td colspan="2">0,0,…,0,8</td><td>0,0,…,0</td></tr><tr style="padding:3px 3px;"><td>35</td><td>7</td><td>0,0,0,-6</td><td>-2</td><td>0,0,-9</td><td>0,0,…,0</td><td>0,0,8</td><td>0,0,…,0</td></tr><tr><td>(0,35)</td><td>(0,7)</td><td>(3,-6)</td><td>(0,-2)</td><td>(2,-9)</td><td>(15,0)</td><td>(2,8)</td><td>EOB</td></tr><tr><th style="text-align:left;" rowspan="2"><strong>③BIT编码</strong></th><td>(0,6, <em><b>100011</b></em>)</td><td>(0,3, <em><b>111</b></em>)</td><td>(3,3, <em><b>001</b></em>)</td><td>(0,2, <em><b>01</b></em>)</td><td>(2,4, <em><b>0110</b></em>)</td><td>(15,-)</td><td>(2,4, <em><b>1000</b></em>)</td><td>EOB</td></tr><tr><td>(0x6,<em><b>100011</b></em>)</td><td>(0x3,<em><b>111</b></em>)</td><td>(0x33,<em><b>001</b></em>)</td><td>(0x2,<em><b>01</b></em>)</td><td>(0x24,<em><b>0110</b></em>)</td><td>(0xF0,-)</td><td>(0x24,<em><b>1000</b></em>)</td><td>EOB</td></tr></tbody></table> 对于括号前面的数字的编码,就要使用到我们提到的哈弗曼编码了,比如下面这张表,就是一张针对数据中的第一个单元,也就是直流(DC)部分的哈弗曼表,由于直流部分没有前置的0,所以取值范围在0~15之间。 <table class="gridtable" style="width:300px;text-align:left;"><tbody><tr><th style="width:50px;">Length</th><th style="width:80px;">Value</th><th style="width:170px;">Bits</th></tr><tr><td>3 bits </td><td>04<br>05<br>03<br>02<br>06<br>01<br>00 (EOB) </td><td>000<br>001<br>010<br>011<br>100<br>101<br>110</td></tr><tr><td>4 bits </td><td>07</td><td>1110</td></tr><tr><td>5 bits </td><td>08</td><td>1111 0</td></tr><tr><td>6 bits </td><td>09</td><td>1111 10</td></tr><tr><td>7 bits </td><td>0A</td><td>1111 110 </td></tr><tr><td>8 bits </td><td>0B</td><td>1111 1110 </td></tr></tbody></table> 举例来说,示例中的DC部分的数据是0x06,对应的二进制编码是“100”,而对于后面的交流部分,取值范围在0~255之间,所以对应的哈弗曼表会更大一些 <table class="gridtable" style="width:300px;text-align:left;"><tbody><tr><th style="width:50px;">Length</th><th style="width:80px;">Value</th><th style="width:170px;">Bits</th></tr><tr><td>2 bits </td><td>01<br>02</td><td>00<br>01</td></tr><tr><td>3 bits </td><td>03</td><td>100</td></tr><tr><td>4 bits </td><td>00 (EOB)<br>04<br>11</td><td>1010<br>1011<br>1100</td></tr><tr><td>5 bits </td><td>05<br>12<br>21</td><td>1101 0<br>1101 1<br>1110 0 </td></tr><tr><td>6 bits </td><td>31<br>41</td><td>1110 10<br>1110 11 </td></tr><tr><td>…</td><td>…</td><td>…</td></tr><tr><td>12 bits </td><td>24<br>33<br>62<br>72</td><td>1111 1111 0100<br>1111 1111 0101<br>1111 1111 0110<br>1111 1111 0111</td></tr><tr><td>15 bits</td><td>82</td><td>1111 1111 1000 000</td></tr><tr><td>16 bits </td><td>09<br>…<br>FA</td><td>1111 1111 1000 0010<br>…<br>1111 1111 1111 1110</td></tr></tbody></table> 这样经过哈弗曼编码,并且序列化后,最终数据成为如下形式 <table class="gridtable" style="width:1000px;text-align:center;"><tbody><tr><th style="width:100px;text-align:left;">①原始数据</th><td style="width:900px;" colspan="14"><!----></td></tr><tr><th rowspan="3" style="text-align:left;"><strong>②RLE编码</strong></th><td colspan="2">35</td><td colspan="2">7</td><td colspan="2">0,0,0,-6</td><td colspan="2">-2</td><td colspan="2">0,0,-9</td><td colspan="3">0,0,…,0,8</td><td>0,0,…,0</td></tr><tr style="padding:3px 3px;"><td colspan="2">35</td><td colspan="2">7</td><td colspan="2">0,0,0,-6</td><td colspan="2">-2</td><td colspan="2">0,0,-9</td><td>0,0,…,0</td><td colspan="2">0,0,8</td><td>0,0,…,0</td></tr><tr><td colspan="2">(0,35)</td><td colspan="2">(0,7)</td><td colspan="2">(3,-6)</td><td colspan="2">(0,-2)</td><td colspan="2">(2,-9)</td><td>(15,0)</td><td colspan="2">(2,8)</td><td>EOB</td></tr><tr><th style="text-align:left;" rowspan="2"><strong>③BIT编码</strong></th><td colspan="2">(0,6, <em><b>100011</b></em>)</td><td colspan="2">(0,3, <em><b>111</b></em>)</td><td colspan="2">(3,3, <em><b>001</b></em>)</td><td colspan="2">(0,2, <em><b>01</b></em>)</td><td colspan="2">(2,4, <em><b>0110</b></em>)</td><td>(15,-)</td><td colspan="2">(2,4, <em><b>1000</b></em>)</td><td>EOB</td></tr><tr><td colspan="2">(0x6,<em><b>100011</b></em>)</td><td colspan="2">(0x3,<em><b>111</b></em>)</td><td colspan="2">(0x33,<em><b>001</b></em>)</td><td colspan="2">(0x2,<em><b>01</b></em>)</td><td colspan="2">(0x24,<em><b>0110</b></em>)</td><td>0xF0</td><td colspan="2">(0x24,<em><b>1000</b></em>)</td><td>EOB</td></tr><tr><th style="text-align:left;"><strong>④哈弗曼编码</strong></th><td><em><b>100</b></em></td><td><em><b>100011</b></em></td><td><em><b>100</b></em></td><td><em><b>111</b></em></td><td><em><b>1111 1111 0101</b></em></td><td><em><b>001</b></em></td><td><em><b>01</b></em></td><td><em><b>01</b></em></td><td><em><b>1111 1111 0100</b></em></td><td><em><b>0110</b></em></td><td><em><b>1111 1111 001</b></em></td><td><em><b>1111 1111 0100</b></em></td><td><em><b>1000</b></em></td><td><em><b>1010</b></em></td></tr><tr><th style="text-align:left;" rowspan="2">⑤序列化</th><td colspan="14"><!----></td></tr><tr><td colspan="14"><!----></td></tr></tbody></table></div><!--[--><!--]--></div><footer class="vp-page-meta"><!----><div class="vp-meta-item git-info"><!----><!----></div></footer><nav class="vp-page-nav" aria-label="page navigation"><a class="route-link auto-link prev" href="/blog/2025/02/JPEG003.html" aria-label="Part3"><!--[--><div class="hint"><span class="arrow left"></span> Prev</div><div class="link"><span>Part3</span></div><!--]--></a><a class="route-link auto-link next" href="/blog/2025/02/JPEG005.html" aria-label="Part5"><!--[--><div class="hint">Next <span class="arrow right"></span></div><div class="link"><span>Part5</span></div><!--]--></a></nav><!--[--><!--]--></main><!--]--></div><!--[--><!----><!--]--><!--]--></div>
|
||
<script type="module" src="/assets/app-CBOiqV2i.js" defer></script>
|
||
</body>
|
||
</html>
|