JS文件压缩成png图片,canvas解析

为了压缩js文件,把js文件转化成PNG图像,然后用 canvas 控件中的 getImageData() 函数将图像再重新读成js文件,这样可以做到很高的压缩比。

PHP写的压缩方法

1 <?
  2     header('Content-type: text/plain');
  3 
  4     $GLOBALS[path] = 'phpgd_images/';
  5     $GLOBALS[filter_path] = 'phpgd_filtered_images/';
  6 
  7     define('OUTPUT_FILTERED',    0);
  8     define('OUTPUT_8BIT',        1);
  9     define('OUTPUT_8BIT_GRAY',    1);
 10     define('OUTPUT_24BIT',        1);
 11     define('OUTPUT_32BIT',        1);
 12 
 13 
 14     encode_file('lipsum.txt', 'lipsum');
 15     encode_file('jquery-1.4.2.min.js', 'jquery');
 16 
 17 
 18     ####################################################################################################
 19 
 20     function encode_file($path, $prefix){
 21 
 22         $data = file_get_contents($path);
 23         $size = strlen($data);
 24 
 25         echo "$path is $size bytes\n";
 26 
 27 
 28         #
 29         # the simplest method is to store the bytes as they are in ascii.
 30         # this is the least space-efficient.
 31         #
 32 
 33         $bytes = array();
 34         for ($i=0; $i<strlen($data); $i++){
 35             $bytes[] = ord(substr($data, $i, 1));
 36         }
 37 
 38         store_bytes($bytes, $prefix.'_ascii');
 39 
 40 
 41         #
 42         # next simplest is to store values using 7 bits, so we store 8
 43         # characters in every 7 bytes
 44         #
 45         # 11111112 22222233 33333444 44445555 55566666 66777777 78888888
 46         #
 47 
 48         $bytes = array();
 49         $seqs = ceil(strlen($data) / 8);
 50         for ($i=0; $i<$seqs; $i++){
 51 
 52             $c1 = ord(substr($data, ($i*8)+0, 1));
 53             $c2 = ord(substr($data, ($i*8)+1, 1));
 54             $c3 = ord(substr($data, ($i*8)+2, 1));
 55             $c4 = ord(substr($data, ($i*8)+3, 1));
 56             $c5 = ord(substr($data, ($i*8)+4, 1));
 57             $c6 = ord(substr($data, ($i*8)+5, 1));
 58             $c7 = ord(substr($data, ($i*8)+6, 1));
 59             $c8 = ord(substr($data, ($i*8)+7, 1));
 60 
 61             $b1 = (($c1 << 1) | ($c2 >> 6)) & 0xff;
 62             $b2 = (($c2 << 2) | ($c3 >> 5)) & 0xff;
 63             $b3 = (($c3 << 3) | ($c4 >> 4)) & 0xff;
 64             $b4 = (($c4 << 4) | ($c5 >> 3)) & 0xff;
 65             $b5 = (($c5 << 5) | ($c6 >> 2)) & 0xff;
 66             $b6 = (($c6 << 6) | ($c7 >> 1)) & 0xff;
 67             $b7 = ((($c7 << 7) & 0x80) | ($c8 & 0x7f)) & 0xff;
 68 
 69             $bytes[] = $b1;
 70             $bytes[] = $b2;
 71             $bytes[] = $b3;
 72             $bytes[] = $b4;
 73             $bytes[] = $b5;
 74             $bytes[] = $b6;
 75             $bytes[] = $b7;
 76         }
 77 
 78         store_bytes($bytes, $prefix.'_seq8');
 79     }
 80 
 81     ####################################################################################################
 82 
 83     function store_bytes($bytes, $mode){
 84 
 85         $size = count($bytes);
 86 
 87 
 88         #
 89         # 8b
 90         #
 91 
 92         $w = floor(sqrt($size));
 93         $h = ceil($size / $w);
 94 
 95         if (OUTPUT_8BIT){
 96             create_8b($mode, 'wide',    $bytes, $size,    1);
 97             create_8b($mode, 'tall',    $bytes, 1,    $size);
 98             create_8b($mode, 'square',    $bytes, $w,    $h);
 99         }
100         if (OUTPUT_8BIT_GRAY){
101             create_8b_gray($mode, 'wide',    $bytes, $size,    1);
102             create_8b_gray($mode, 'tall',    $bytes, 1,    $size);
103             create_8b_gray($mode, 'square',    $bytes, $w,    $h);
104         }
105 
106 
107         #
108         # 24b
109         #
110 
111         $px = ceil($size / 3);
112 
113         $w = floor(sqrt($px));
114         $h = ceil($px / $w);
115 
116         if (OUTPUT_24BIT){
117             create_24b($mode, 'wide',    $bytes, $px,    1);
118             create_24b($mode, 'tall',    $bytes, 1,    $px);
119             create_24b($mode, 'square',    $bytes, $w,    $h);
120         }
121 
122 
123         #
124         # 32b
125         #
126 
127         $px = ceil($size / 4);
128 
129         $w = floor(sqrt($px));
130         $h = ceil($px / $w);
131 
132         if (OUTPUT_32BIT){
133             create_32b($mode, 'wide',    $bytes, $px,    1);
134             create_32b($mode, 'tall',    $bytes, 1,    $px);
135             create_32b($mode, 'square',    $bytes,    $w,    $h);
136         }
137     }
138 
139     ####################################################################################################
140 
141     function create_8b($mode, $shape, $bytes, $w, $h){
142 
143         $im = imagecreate($w, $h);
144 
145         $cols = array();
146         for ($i=0; $i<256; $i++){
147             $cols[$i] = imagecolorallocate($im, $i, 0, 0);
148         }
149 
150         $i=0;
151         for ($y=0; $y<$h; $y++){
152         for ($x=0; $x<$w; $x++){
153 
154             $b1 = intval($bytes[$i]);
155 
156             $col = $cols[$b1];
157 
158             imagesetpixel($im, $x, $y, $col);
159 
160             $i++;
161         }
162         }
163 
164         save_png($im, "{$mode}_8b_{$shape}");
165         imagedestroy($im);
166     }
167 
168     ####################################################################################################
169 
170     function create_8b_gray($mode, $shape, $bytes, $w, $h){
171 
172         $im = imagecreate($w, $h);
173 
174         $cols = array();
175         for ($i=0; $i<256; $i++){
176             $cols[$i] = imagecolorallocate($im, $i, $i, $i);
177         }
178 
179         $i=0;
180         for ($y=0; $y<$h; $y++){
181         for ($x=0; $x<$w; $x++){
182 
183             $b1 = intval($bytes[$i]);
184 
185             $col = $cols[$b1];
186 
187             imagesetpixel($im, $x, $y, $col);
188 
189             $i++;
190         }
191         }
192 
193         save_png($im, "{$mode}_8b_gray_{$shape}");
194         imagedestroy($im);
195     }
196 
197     ####################################################################################################
198     function create_24b($mode, $shape, $bytes, $w, $h){
199 
200         $im = imagecreatetruecolor($w, $h);
201         imageAlphaBlending($im, false);
202         imageSaveAlpha($im, false);
203 
204         $i=0;
205         for ($y=0; $y<$h; $y++){
206         for ($x=0; $x<$w; $x++){
207 
208             $b1 = $bytes[($i*3)+0];
209             $b2 = $bytes[($i*3)+1];
210             $b3 = $bytes[($i*3)+2];
211 
212             $col = imagecolorallocate($im, $b1, $b2, $b3);
213 
214             imagesetpixel($im, $x, $y, $col);
215 
216             $i++;
217         }
218         }
219 
220         save_png($im, "{$mode}_24b_{$shape}");
221         imagedestroy($im);
222     }
223 
224     ####################################################################################################
225 
226     function create_32b($mode, $shape, $bytes, $w, $h){
227 
228         $im = imagecreatetruecolor($w, $h);
229         imageAlphaBlending($im, false);
230         imageSaveAlpha($im, true);
231 
232         $i=0;
233         for ($y=0; $y<$h; $y++){
234         for ($x=0; $x<$w; $x++){
235 
236             $b1 = $bytes[($i*4)+0];
237             $b2 = $bytes[($i*4)+1];
238             $b3 = $bytes[($i*4)+2];
239             $b4 = $bytes[($i*4)+3];
240 
241             $col = imagecolorallocatealpha($im, $b1, $b2, $b3, $b4);
242 
243             #echo "$b1, $b2, $b3, $b4 ..";
244 
245             imagesetpixel($im, $x, $y, $col);
246 
247             $i++;
248         }
249         }
250 
251         save_png($im, "{$mode}_32b_{$shape}");
252         imagedestroy($im);        
253     }
254 
255     ####################################################################################################
256 
257     function save_png($im, $name){
258 
259         for ($a=0; $a<2; $a++){
260         for ($b=0; $b<2; $b++){
261         for ($c=0; $c<2; $c++){
262         for ($d=0; $d<2; $d++){
263 
264             $filter = 0;
265             $bits = '';
266             if ($a){ $filter |= PNG_FILTER_SUB;   $bits .= '_sub'; }
267             if ($b){ $filter |= PNG_FILTER_UP;    $bits .= '_up'; }
268             if ($c){ $filter |= PNG_FILTER_AVG;   $bits .= '_avg'; }
269             if ($d){ $filter |= PNG_FILTER_PAETH; $bits .= '_paeth'; }
270 
271             if ($filter){
272                 if (OUTPUT_FILTERED){
273                     imagepng($im, $GLOBALS[filter_path]."{$name}{$bits}.png", 9, $filter);
274                 }
275             }else{
276                 imagepng($im, $GLOBALS[path]."{$name}.png", 9, $filter);
277             }
278         }
279         }
280         }
281         }
282     }
283 
284 ?>

将图像读取为JS文件

1 function loadPNGData(strFilename, fncCallback) {
 2     // test for canvas and getImageData
 3     var bCanvas = false;
 4     var oCanvas = document.createElement("canvas");
 5     if (oCanvas.getContext) {
 6         var oCtx = oCanvas.getContext("2d");
 7         if (oCtx.getImageData) {
 8             bCanvas = true;
 9         }
10     }
11     if (bCanvas) {
12         var oImg = new Image();
13         oImg.style.position = "absolute";
14         oImg.style.left = "-10000px";
15         document.body.appendChild(oImg);
16         oImg.onload = function() {
17             var iWidth = this.offsetWidth;
18             var iHeight = this.offsetHeight;
19             oCanvas.width = iWidth;
20             oCanvas.height = iHeight;
21             oCanvas.style.width = iWidth+"px";
22             oCanvas.style.height = iHeight+"px";
23             var oText = document.getElementById("output");
24             oCtx.drawImage(this,0,0);
25             var oData = oCtx.getImageData(0,0,iWidth,iHeight).data;
26             var a = [];
27             var len = oData.length;
28             var p = -1;
29             for (var i=0;i<len;i+=4) {
30                 if (oData[i] > 0)
31                     a[++p] = String.fromCharCode(oData[i]);
32             };
33             var strData = a.join("");
34             if (fncCallback) {
35                 fncCallback(strData);
36             }
37             document.body.removeChild(oImg);
38         }
39         oImg.src = strFilename;
40         return true;
41     } else {
42         return false;
43     }
44 }

For more detail, please refer to http://blog.nihilogic.dk/2008/05/compression-using-canvas-and-png.html


原文链接: https://www.cnblogs.com/yanzhihong23/archive/2012/10/23/2735140.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/66789

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午12:30
下一篇 2023年2月9日 下午12:30

相关推荐