mirror of
https://github.com/seigler/dash-docs
synced 2025-07-27 17:56:16 +00:00
109 lines
21 KiB
HTML
109 lines
21 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.14"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>Dash Core: contrib/devtools/optimize-pngs.py Source File</title>
|
|
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="jquery.js"></script>
|
|
<script type="text/javascript" src="dynsections.js"></script>
|
|
<link href="navtree.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="resize.js"></script>
|
|
<script type="text/javascript" src="navtreedata.js"></script>
|
|
<script type="text/javascript" src="navtree.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(initResizable);
|
|
/* @license-end */</script>
|
|
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
|
<script type="text/javascript" src="search/searchdata.js"></script>
|
|
<script type="text/javascript" src="search/search.js"></script>
|
|
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
|
</head>
|
|
<body>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<div id="titlearea">
|
|
<table cellspacing="0" cellpadding="0">
|
|
<tbody>
|
|
<tr style="height: 56px;">
|
|
<td id="projectlogo"><img alt="Logo" src="bitcoin_logo_doxygen.png"/></td>
|
|
<td id="projectalign" style="padding-left: 0.5em;">
|
|
<div id="projectname">Dash Core
|
|
 <span id="projectnumber">0.12.2.1</span>
|
|
</div>
|
|
<div id="projectbrief">P2P Digital Currency</div>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.14 -->
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
var searchBox = new SearchBox("searchBox", "search",false,'Search');
|
|
/* @license-end */
|
|
</script>
|
|
<script type="text/javascript" src="menudata.js"></script>
|
|
<script type="text/javascript" src="menu.js"></script>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(function() {
|
|
initMenu('',true,false,'search.php','Search');
|
|
$(document).ready(function() { init_search(); });
|
|
});
|
|
/* @license-end */</script>
|
|
<div id="main-nav"></div>
|
|
</div><!-- top -->
|
|
<div id="side-nav" class="ui-resizable side-nav-resizable">
|
|
<div id="nav-tree">
|
|
<div id="nav-tree-contents">
|
|
<div id="nav-sync" class="sync"></div>
|
|
</div>
|
|
</div>
|
|
<div id="splitbar" style="-moz-user-select:none;"
|
|
class="ui-resizable-handle">
|
|
</div>
|
|
</div>
|
|
<script type="text/javascript">
|
|
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&dn=gpl-2.0.txt GPL-v2 */
|
|
$(document).ready(function(){initNavTree('optimize-pngs_8py_source.html','');});
|
|
/* @license-end */
|
|
</script>
|
|
<div id="doc-content">
|
|
<!-- window showing the filter options -->
|
|
<div id="MSearchSelectWindow"
|
|
onmouseover="return searchBox.OnSearchSelectShow()"
|
|
onmouseout="return searchBox.OnSearchSelectHide()"
|
|
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
|
</div>
|
|
|
|
<!-- iframe showing the search results (closed by default) -->
|
|
<div id="MSearchResultsWindow">
|
|
<iframe src="javascript:void(0)" frameborder="0"
|
|
name="MSearchResults" id="MSearchResults">
|
|
</iframe>
|
|
</div>
|
|
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">optimize-pngs.py</div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<a href="optimize-pngs_8py.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html"> 1</a></span> <span class="comment">#!/usr/bin/env python</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="stringliteral">'''</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="stringliteral">Run this script every time you change one of the png files. Using pngcrush, it will optimize the png files, remove various color profiles, remove ancillary chunks (alla) and text chunks (text).</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="stringliteral">#pngcrush -brute -ow -rem gAMA -rem cHRM -rem iCCP -rem sRGB -rem alla -rem text</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="stringliteral">'''</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="keyword">import</span> os</div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="keyword">import</span> sys</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="keyword">import</span> subprocess</div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="keyword">import</span> hashlib</div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="keyword">from</span> PIL <span class="keyword">import</span> Image</div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> </div><div class="line"><a name="l00012"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a1a5feb72295b25b8fb0fe2e7cbd7e8a6"> 12</a></span> <span class="keyword">def </span><a class="code" href="namespaceoptimize-pngs.html#a1a5feb72295b25b8fb0fe2e7cbd7e8a6">file_hash</a>(filename):</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>  <span class="stringliteral">'''Return hash of raw file contents'''</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>  with open(filename, <span class="stringliteral">'rb'</span>) <span class="keyword">as</span> f:</div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>  <span class="keywordflow">return</span> hashlib.sha256(f.read()).hexdigest()</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#aa58d7620b522724f34eca4b9318d9fbf"> 17</a></span> <span class="keyword">def </span><a class="code" href="namespaceoptimize-pngs.html#aa58d7620b522724f34eca4b9318d9fbf">content_hash</a>(filename):</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>  <span class="stringliteral">'''Return hash of RGBA contents of image'''</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>  i = Image.open(filename)</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>  i = i.convert(<span class="stringliteral">'RGBA'</span>)</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>  data = i.tobytes()</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="keywordflow">return</span> hashlib.sha256(data).hexdigest()</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> </div><div class="line"><a name="l00024"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a734336267617bc57e580c9626cb55ff2"> 24</a></span> pngcrush = <span class="stringliteral">'pngcrush'</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#af8ad0a7cd8170999cc35edabe08d0862"> 25</a></span> git = <span class="stringliteral">'git'</span></div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#ae547df028bff5cc8d2b80e39b4ae8602"> 26</a></span> folders = [<span class="stringliteral">"src/qt/res/movies"</span>, <span class="stringliteral">"src/qt/res/icons"</span>, <span class="stringliteral">"src/qt/res/icons/crownium"</span>, <span class="stringliteral">"src/qt/res/icons/drkblue"</span>, <span class="stringliteral">"src/qt/res/icons/light"</span>, <span class="stringliteral">"src/qt/res/icons/trad"</span>, <span class="stringliteral">"src/qt/res/images"</span>, <span class="stringliteral">"src/qt/res/images/crownium"</span>, <span class="stringliteral">"src/qt/res/images/drkblue"</span>, <span class="stringliteral">"src/qt/res/images/light"</span>, <span class="stringliteral">"src/qt/res/images/trad"</span>, <span class="stringliteral">"share/pixmaps"</span>]</div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#aeb716c5857b62d0337c0816ec4e04ddb"> 27</a></span> basePath = subprocess.check_output([git, <span class="stringliteral">'rev-parse'</span>, <span class="stringliteral">'--show-toplevel'</span>]).rstrip(<span class="stringliteral">'\n'</span>)</div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a87036ac99f26dd29f4ef0094217ee059"> 28</a></span> totalSaveBytes = 0</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a70ae4b41713d7792134729d7cbbd6a48"> 29</a></span> noHashChange = <span class="keyword">True</span></div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#ad0db71c1143dcc79f69eb0f800dae9cd"> 31</a></span> outputArray = []</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="keywordflow">for</span> folder <span class="keywordflow">in</span> folders:</div><div class="line"><a name="l00033"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#afc688605bf7d0afc814155848fc66930"> 33</a></span>  absFolder=os.path.join(basePath, folder)</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">for</span> file <span class="keywordflow">in</span> os.listdir(absFolder):</div><div class="line"><a name="l00035"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a76c19bdc3d4e10f1298482096d0fe7b2"> 35</a></span>  extension = os.path.splitext(file)[1]</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <span class="keywordflow">if</span> extension.lower() == <span class="stringliteral">'.png'</span>:</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  print(<span class="stringliteral">"optimizing "</span>+file+<span class="stringliteral">"..."</span>),</div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a4c0d5b410fba68a43060e802b14a554a"> 38</a></span>  file_path = os.path.join(absFolder, file)</div><div class="line"><a name="l00039"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a01d3ca3d5e4fb25dee7179693fca1809"> 39</a></span>  fileMetaMap = {<span class="stringliteral">'file'</span> : file, <span class="stringliteral">'osize'</span>: os.path.getsize(file_path), <span class="stringliteral">'sha256Old'</span> : <a class="code" href="namespaceoptimize-pngs.html#a1a5feb72295b25b8fb0fe2e7cbd7e8a6">file_hash</a>(file_path)};</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  fileMetaMap[<span class="stringliteral">'contentHashPre'</span>] = <a class="code" href="namespaceoptimize-pngs.html#aa58d7620b522724f34eca4b9318d9fbf">content_hash</a>(file_path)</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#ac7f8c8c8c2edc2832dfe3804604cb030"> 42</a></span>  pngCrushOutput = <span class="stringliteral">""</span></div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <span class="keywordflow">try</span>:</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  pngCrushOutput = subprocess.check_output(</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  [pngcrush, <span class="stringliteral">"-brute"</span>, <span class="stringliteral">"-ow"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"gAMA"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"cHRM"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"iCCP"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"sRGB"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"alla"</span>, <span class="stringliteral">"-rem"</span>, <span class="stringliteral">"text"</span>, file_path],</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  stderr=subprocess.STDOUT).rstrip(<span class="stringliteral">'\n'</span>)</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <span class="keywordflow">except</span>:</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="keywordflow">print</span> <span class="stringliteral">"pngcrush is not installed, aborting..."</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  sys.exit(0)</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="comment">#verify</span></div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a98904564b461b52c82b042a4cbe21c0c"> 52</a></span>  <span class="keywordflow">if</span> <span class="stringliteral">"Not a PNG file"</span> <span class="keywordflow">in</span> subprocess.check_output([pngcrush, <span class="stringliteral">"-n"</span>, <span class="stringliteral">"-v"</span>, file_path], stderr=subprocess.STDOUT):</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <span class="keywordflow">print</span> <span class="stringliteral">"PNG file "</span>+file+<span class="stringliteral">" is corrupted after crushing, check out pngcursh version"</span></div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  sys.exit(1)</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  </div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  fileMetaMap[<span class="stringliteral">'sha256New'</span>] = <a class="code" href="namespaceoptimize-pngs.html#a1a5feb72295b25b8fb0fe2e7cbd7e8a6">file_hash</a>(file_path)</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  fileMetaMap[<span class="stringliteral">'contentHashPost'</span>] = <a class="code" href="namespaceoptimize-pngs.html#aa58d7620b522724f34eca4b9318d9fbf">content_hash</a>(file_path)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="keywordflow">if</span> fileMetaMap[<span class="stringliteral">'contentHashPre'</span>] != fileMetaMap[<span class="stringliteral">'contentHashPost'</span>]:</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">print</span> <span class="stringliteral">"Image contents of PNG file "</span>+file+<span class="stringliteral">" before and after crushing don't match"</span></div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  sys.exit(1)</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> </div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  fileMetaMap[<span class="stringliteral">'psize'</span>] = os.path.getsize(file_path)</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  outputArray.append(fileMetaMap)</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  print(<span class="stringliteral">"done\n"</span>),</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span> <span class="keywordflow">print</span> <span class="stringliteral">"summary:\n+++++++++++++++++"</span></div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> <span class="keywordflow">for</span> fileDict <span class="keywordflow">in</span> outputArray:</div><div class="line"><a name="l00069"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#aa037846016b6804df1afcf53a3483a0c"> 69</a></span>  oldHash = fileDict[<span class="stringliteral">'sha256Old'</span>]</div><div class="line"><a name="l00070"></a><span class="lineno"><a class="line" href="namespaceoptimize-pngs.html#a55e5e55b350df979ce4f3b71ca4e6ce9"> 70</a></span>  newHash = fileDict[<span class="stringliteral">'sha256New'</span>]</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  totalSaveBytes += fileDict[<span class="stringliteral">'osize'</span>] - fileDict[<span class="stringliteral">'psize'</span>]</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  noHashChange = noHashChange <span class="keywordflow">and</span> (oldHash == newHash)</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">print</span> fileDict[<span class="stringliteral">'file'</span>]+<span class="stringliteral">"\n size diff from: "</span>+str(fileDict[<span class="stringliteral">'osize'</span>])+<span class="stringliteral">" to: "</span>+str(fileDict[<span class="stringliteral">'psize'</span>])+<span class="stringliteral">"\n old sha256: "</span>+oldHash+<span class="stringliteral">"\n new sha256: "</span>+newHash+<span class="stringliteral">"\n"</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  </div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> <span class="keywordflow">print</span> <span class="stringliteral">"completed. Checksum stable: "</span>+str(noHashChange)+<span class="stringliteral">". Total reduction: "</span>+str(totalSaveBytes)+<span class="stringliteral">" bytes"</span></div><div class="ttc" id="namespaceoptimize-pngs_html_aa58d7620b522724f34eca4b9318d9fbf"><div class="ttname"><a href="namespaceoptimize-pngs.html#aa58d7620b522724f34eca4b9318d9fbf">optimize-pngs.content_hash</a></div><div class="ttdeci">def content_hash(filename)</div><div class="ttdef"><b>Definition:</b> <a href="optimize-pngs_8py_source.html#l00017">optimize-pngs.py:17</a></div></div>
|
|
<div class="ttc" id="namespaceoptimize-pngs_html_a1a5feb72295b25b8fb0fe2e7cbd7e8a6"><div class="ttname"><a href="namespaceoptimize-pngs.html#a1a5feb72295b25b8fb0fe2e7cbd7e8a6">optimize-pngs.file_hash</a></div><div class="ttdeci">def file_hash(filename)</div><div class="ttdef"><b>Definition:</b> <a href="optimize-pngs_8py_source.html#l00012">optimize-pngs.py:12</a></div></div>
|
|
</div><!-- fragment --></div><!-- contents -->
|
|
</div><!-- doc-content -->
|
|
<!-- start footer part -->
|
|
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
|
|
<ul>
|
|
<li class="navelem"><a class="el" href="dir_3847941dc22744d30c1d316a1f1a60e2.html">contrib</a></li><li class="navelem"><a class="el" href="dir_37d1fea5042680bd15e1881fba32bbab.html">devtools</a></li><li class="navelem"><a class="el" href="optimize-pngs_8py.html">optimize-pngs.py</a></li>
|
|
<li class="footer">Generated on Thu Dec 14 2017 13:15:01 for Dash Core by
|
|
<a href="http://www.doxygen.org/index.html">
|
|
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.14 </li>
|
|
</ul>
|
|
</div>
|
|
</body>
|
|
</html>
|