ef93f21c88e0ecae58c0c9def83febe0e68ac243
[imagesqueeze.git] / doc / index.html
1 <!doctype html>
2 <html lang="en">
3 <head>
4 <title>ImageSqueeze - lossy image codec</title>
5 <!-- 2019-01-27 P 00:43 -->
6 <meta charset="utf-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="generator" content="Org-mode">
9 <meta name="author" content="Svjatoslav Agejenko">
10 <link href="https://bootswatch.com/3/darkly/bootstrap.min.css" rel="stylesheet">
11 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
12 <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.5/js/bootstrap.min.js"></script>
13 <style type="text/css">
14 footer {background-color: #111 !important;}
15 pre {background-color: #111; color: #ccc;}
16 </style>
17 <style type="text/css">
18 /* org mode styles on top of twbs */
19
20 html {
21     position: relative;
22     min-height: 100%;
23 }
24
25 body {
26     font-size: 18px;
27     margin-bottom: 105px;
28 }
29
30 footer {
31     position: absolute;
32     bottom: 0;
33     width: 100%;
34     height: 101px;
35     background-color: #f5f5f5;
36 }
37
38 footer > div {
39     padding: 10px;
40 }
41
42 footer p {
43     margin: 0 0 5px;
44     text-align: center;
45     font-size: 16px;
46 }
47
48 #table-of-contents {
49     margin-top: 20px;
50     margin-bottom: 20px;
51 }
52
53 blockquote p {
54     font-size: 18px;
55 }
56
57 pre {
58     font-size: 16px;
59 }
60
61 .footpara {
62     display: inline-block;
63 }
64
65 figcaption {
66   font-size: 16px;
67   color: #666;
68   font-style: italic;
69   padding-bottom: 15px;
70 }
71
72 /* from twbs docs */
73
74 .bs-docs-sidebar.affix {
75     position: static;
76 }
77 @media (min-width: 768px) {
78     .bs-docs-sidebar {
79         padding-left: 20px;
80     }
81 }
82
83 /* All levels of nav */
84 .bs-docs-sidebar .nav > li > a {
85     display: block;
86     padding: 4px 20px;
87     font-size: 14px;
88     font-weight: 500;
89     color: #999;
90 }
91 .bs-docs-sidebar .nav > li > a:hover,
92 .bs-docs-sidebar .nav > li > a:focus {
93     padding-left: 19px;
94     color: #A1283B;
95     text-decoration: none;
96     background-color: transparent;
97     border-left: 1px solid #A1283B;
98 }
99 .bs-docs-sidebar .nav > .active > a,
100 .bs-docs-sidebar .nav > .active:hover > a,
101 .bs-docs-sidebar .nav > .active:focus > a {
102     padding-left: 18px;
103     font-weight: bold;
104     color: #A1283B;
105     background-color: transparent;
106     border-left: 2px solid #A1283B;
107 }
108
109 /* Nav: second level (shown on .active) */
110 .bs-docs-sidebar .nav .nav {
111     display: none; /* Hide by default, but at >768px, show it */
112     padding-bottom: 10px;
113 }
114 .bs-docs-sidebar .nav .nav > li > a {
115     padding-top: 1px;
116     padding-bottom: 1px;
117     padding-left: 30px;
118     font-size: 12px;
119     font-weight: normal;
120 }
121 .bs-docs-sidebar .nav .nav > li > a:hover,
122 .bs-docs-sidebar .nav .nav > li > a:focus {
123     padding-left: 29px;
124 }
125 .bs-docs-sidebar .nav .nav > .active > a,
126 .bs-docs-sidebar .nav .nav > .active:hover > a,
127 .bs-docs-sidebar .nav .nav > .active:focus > a {
128     padding-left: 28px;
129     font-weight: 500;
130 }
131
132 /* Nav: third level (shown on .active) */
133 .bs-docs-sidebar .nav .nav .nav {
134     padding-bottom: 10px;
135 }
136 .bs-docs-sidebar .nav .nav .nav > li > a {
137     padding-top: 1px;
138     padding-bottom: 1px;
139     padding-left: 40px;
140     font-size: 12px;
141     font-weight: normal;
142 }
143 .bs-docs-sidebar .nav .nav .nav > li > a:hover,
144 .bs-docs-sidebar .nav .nav .nav > li > a:focus {
145     padding-left: 39px;
146 }
147 .bs-docs-sidebar .nav .nav .nav > .active > a,
148 .bs-docs-sidebar .nav .nav .nav > .active:hover > a,
149 .bs-docs-sidebar .nav .nav .nav > .active:focus > a {
150     padding-left: 38px;
151     font-weight: 500;
152 }
153
154 /* Show and affix the side nav when space allows it */
155 @media (min-width: 992px) {
156     .bs-docs-sidebar .nav > .active > ul {
157         display: block;
158     }
159     /* Widen the fixed sidebar */
160     .bs-docs-sidebar.affix,
161     .bs-docs-sidebar.affix-bottom {
162         width: 213px;
163     }
164     .bs-docs-sidebar.affix {
165         position: fixed; /* Undo the static from mobile first approach */
166         top: 20px;
167     }
168     .bs-docs-sidebar.affix-bottom {
169         position: absolute; /* Undo the static from mobile first approach */
170     }
171     .bs-docs-sidebar.affix .bs-docs-sidenav,.bs-docs-sidebar.affix-bottom .bs-docs-sidenav {
172         margin-top: 0;
173         margin-bottom: 0
174     }
175 }
176 @media (min-width: 1200px) {
177     /* Widen the fixed sidebar again */
178     .bs-docs-sidebar.affix-bottom,
179     .bs-docs-sidebar.affix {
180         width: 263px;
181     }
182 }
183 </style>
184 <script type="text/javascript">
185 $(function() {
186     'use strict';
187
188     $('.bs-docs-sidebar li').first().addClass('active');
189
190     $(document.body).scrollspy({target: '.bs-docs-sidebar'});
191
192     $('.bs-docs-sidebar').affix();
193 });
194 </script>
195 </head>
196 <body>
197 <div id="content" class="container">
198 <div class="row"><div class="col-md-9"><h1 class="title">ImageSqueeze - lossy image codec</h1>
199 <div id="outline-container-sec-1" class="outline-2">
200 <h2 id="sec-1"><span class="section-number-2">1</span> General</h2>
201 <div class="outline-text-2" id="text-1">
202 <ul class="org-ul">
203 <li>This program is free software: you can redistribute it and/or modify
204 it under the terms of the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a> as
205 published by the Free Software Foundation, either version 3 of the
206 License, or (at your option) any later version.
207 </li>
208
209 <li>Program author:
210 <ul class="org-ul">
211 <li>Svjatoslav Agejenko
212 </li>
213 <li>Homepage: <a href="https://svjatoslav.eu">https://svjatoslav.eu</a>
214 </li>
215 <li>Email: <a href="mailto://svjatoslav@svjatoslav.eu">mailto://svjatoslav@svjatoslav.eu</a>
216 </li>
217 </ul>
218 </li>
219
220 <li><a href="https://www.svjatoslav.eu/projects/">Other software projects hosted at svjatoslav.eu</a>
221 </li>
222 </ul>
223 </div>
224
225 <div id="outline-container-sec-1-1" class="outline-3">
226 <h3 id="sec-1-1"><span class="section-number-3">1.1</span> Source code</h3>
227 <div class="outline-text-3" id="text-1-1">
228 <ul class="org-ul">
229 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=imagesqueeze.git;a=snapshot;h=HEAD;sf=tgz">Download latest snapshot in TAR GZ format</a>
230 </li>
231
232 <li><a href="https://www2.svjatoslav.eu/gitweb/?p=imagesqueeze.git;a=summary">Browse Git repository online</a>
233 </li>
234
235 <li>Clone Git repository using command:
236 <pre class="example">
237 git clone https://www2.svjatoslav.eu/git/imagesqueeze.git
238
239 </pre>
240 </li>
241 </ul>
242 </div>
243 </div>
244 </div>
245
246 <div id="outline-container-sec-2" class="outline-2">
247 <h2 id="sec-2"><span class="section-number-2">2</span> Overview</h2>
248 <div class="outline-text-2" id="text-2">
249 <p>
250 Lossy image codec. Optimized for photos. I developed it to test out an
251 image compression ideas.
252 </p>
253
254 <p>
255 I believe my <a href="#sec-3-1">algorighm has interesting advantages.</a>
256 </p>
257
258 <p>
259 Below are original photo and the same image being compressed down to
260 ~93 Kb and then decompressed.
261 </p>
262
263
264 <figure>
265 <p><img src="originalAndCompressed.png" class="img-responsive" alt="originalAndCompressed.png">
266 </p>
267 </figure>
268
269 <p>
270 When looking very closely, slight grainyness, loss of color precision
271 and blurriness (loss of detail) could be noticed as a compression
272 artifacts. Still sharp edges are always preserved. Also no blocks
273 typical to JPEG are ever seen.  I think that is awesome result for
274 just ~ 2.5 bits per pixel on that color photo.
275 </p>
276 </div>
277 </div>
278 <div id="outline-container-sec-3" class="outline-2">
279 <h2 id="sec-3"><span class="section-number-2">3</span> Algorithm description</h2>
280 <div class="outline-text-2" id="text-3">
281 <ul class="org-ul">
282 <li>Color image is split into three separate channels: Y, U and V.
283 <ul class="org-ul">
284 <li>Each channel is independently compressed.
285 </li>
286 </ul>
287 </li>
288
289 <li>Single channel compression method:
290
291 <ul class="org-ul">
292 <li>Algorithm is inspired by <a href="https://en.wikipedia.org/wiki/Diamond-square_algorithm">diamond-square algorithm</a> that is meant to
293 produce random heightmap/plasma effect.
294 </li>
295
296 <li>During image compression: 2D image surface is iterated in the
297 similar manner to diamond-square algorithm. Average color from
298 neighbors is calculated and difference between neighbors average
299 and actual pixel color is saved. As the pixel grid becomes
300 gradually more dense, difference between neighbors tends to get
301 smaller, thereby requiring less bits per pixel for storing the
302 difference.
303 </li>
304 </ul>
305 </li>
306 </ul>
307 </div>
308 <div id="outline-container-sec-3-1" class="outline-3">
309 <h3 id="sec-3-1"><a id="ID-1d917f74-e763-4a71-976e-4aa60732efa6" name="ID-1d917f74-e763-4a71-976e-4aa60732efa6"></a><span class="section-number-3">3.1</span> Algorighm advantages</h3>
310 <div class="outline-text-3" id="text-3-1">
311 <ul class="org-ul">
312 <li>It can be applied to any amount of dimensions, even for sound and
313 volumetric data.
314 </li>
315
316 <li>Algorithm can operate in lossy and lossless mode.
317 </li>
318
319 <li>Algorithm naturally handles progressive loading. That is: low
320 resolution thumbnail of entire thing is immediately available and
321 gets gradually more dense during entire loading process.
322 </li>
323
324 <li>Algorithm naturally supports variable resolution. That is: different
325 areas can be encoded with different resolutions / pixel densities.
326 </li>
327
328 <li>Fast: Very little computations per pixel.
329 </li>
330 </ul>
331 </div>
332 </div>
333 </div>
334
335 <div id="outline-container-sec-4" class="outline-2">
336 <h2 id="sec-4"><span class="section-number-2">4</span> <span class="label label-primary TODO">TODO</span> Things to improve</h2>
337 <div class="outline-text-2" id="text-4">
338 <ul class="org-ul">
339 <li>Code documentation is weak.
340 </li>
341
342 <li>Better sample applications needed:
343 <ul class="org-ul">
344 <li>Commandline image conversion utility.
345 </li>
346 <li>Image viewer.
347 </li>
348 </ul>
349 </li>
350
351 <li>Add lossless support.
352 </li>
353
354 <li>Extract algorithm key parts into reusable library and make it
355 variable dimensional. So that the same code can be used for sound,
356 image and volumetric data compression/decompression.
357 </li>
358 </ul>
359 </div>
360 </div>
361 </div><div class="col-md-3"><nav id="table-of-contents">
362 <div id="text-table-of-contents" class="bs-docs-sidebar">
363 <ul class="nav">
364 <li><a href="#sec-1">1. General</a>
365 <ul class="nav">
366 <li><a href="#sec-1-1">1.1. Source code</a></li>
367 </ul>
368 </li>
369 <li><a href="#sec-2">2. Overview</a></li>
370 <li><a href="#sec-3">3. Algorithm description</a>
371 <ul class="nav">
372 <li><a href="#sec-3-1">3.1. Algorighm advantages</a></li>
373 </ul>
374 </li>
375 <li><a href="#sec-4">4. Things to improve</a></li>
376 </ul>
377 </div>
378 </nav>
379 </div></div></div>
380 <footer id="postamble" class="">
381 <div><p class="author">Author: Svjatoslav Agejenko</p>
382 <p class="date">Created: 2019-01-27 P 00:43</p>
383 <p class="creator"><a href="http://www.gnu.org/software/emacs/">Emacs</a> 26.1 (<a href="http://orgmode.org">Org-mode</a> 9.1.9)</p>
384 </div>
385 </footer>
386 </body>
387 </html>