请选择 进入手机版 | 继续访问电脑版
收藏本站腾讯微博新浪微博
点点网模板设计大赛 phpchina

经典论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

蓝色理想 最新研发动态 用悬赏 三天解决问题 解决访问速度慢 论坛支持农历生日 - 给官方提建议

论坛活动及任务 归纳网站最新活动 地图任务 邮件更新任务:保护帐号安全

积分换实物,来参加蓝色理想积分兑换吧! 联系招聘客服 蓝色理想帮你找工作! 万元奖励等你拿——点点网模板设计大赛

查看: 18374|回复: 22

[AS1&2] 也谈Flash AS2 中的拍照图片无损压缩 [复制链接]

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-4 23:46:03 |显示全部楼层
看过FlashK写的《关于Flash AS2 中的拍照图片传输量太大的解决思路》,也想加一个算法。
我们都说无损压缩吧,保留点阵数据。
此法压缩的数据已经接近BMP格式的图片大小,我的机器花费大约1秒处理200*200的图片,比未压缩的字符的压缩比率为50%。具体图片比较黑暗则压缩更好。

未压缩文本:295k
压缩文本:143k
高阶压缩:127k
BMP图片(200*200一样的图片):117k


压缩结果类似:
200,200='c,'c,'c,'c,'c,Eg,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,Eg,Eg,Eg,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,R9,R9,R9,R9,0i,0i,0i,0i,0i,0i,0i,0i,0i,0i,0i,0i,Eg,Q9,){,)c,0i,Eg,Eg,0i,0i,0i,R9,R9,R9,R9,)c,/E,'c,0i,R9,0i,R9,R9,R9,R9,R9,R9,0i,)c,)c,R9,R9,R9,R9,R9,R9,R9,R9,R9,R9,EE


我这里的思维是用自定义的进制来处理数字压缩的问题。

原理:按字符来算,一个数字用2进制是最长的,用十进制则更短,用16进制更短,那用尽量大的进制则字符越少。

进阶压缩算法:选择起始点算法,分段压缩,邻近同样字符用范围数表示。

先说一下本次的算法:

  1. //program by hqlulu
  2. //www.aslibra.com

  3. import flash.display.BitmapData;
  4. //自定义宽和高
  5. var max_w:Number = 200;
  6. var max_h:Number = 200;
  7. var myBitmap:BitmapData = new BitmapData(max_w, max_h, true, 0x000000);
  8. myBitmap.draw(_root);
  9. view_mc.attachBitmap(myBitmap, 10);
  10. //是否压缩
  11. //我的测试数据:
  12. //true:1382 ms
  13. //false:364 ms
  14. var is_compress:Boolean = true;
  15. //
  16. //定义进制字符,在这里差不多把所有的字符用上了,用的越多压缩越好,不过选择ffffff所达到的字符数最好
  17. //这里对于图片加密也有很大的帮助!
  18. var code:String = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+'";
  19. var code_array:Array = code.split("");
  20. //多少个字符就是多少进制了
  21. var byte:Number = code.length;
  22. function getcode(i:Number):String {
  23.         //取整求余法
  24.         var return_code:String = "";
  25.         while ((i=Math.ceil(i/byte))>byte) {
  26.                 return_code += code_array[i%byte];
  27.         }
  28.         return_code += code_array[i];
  29.         return return_code;
  30. }
  31. //
  32. //记录的数组
  33. var p_array:Array = new Array();
  34. var timer:Number = getTimer();
  35. function save2array():Void {
  36.         for (var i:Number = 0; i<max_w; i++) {
  37.                 p_array[i] = new Array();
  38.                 for (var j:Number = 0; j<max_h; j++) {
  39.                         //这里不加判断的话,速度可以提高些
  40.                         if (is_compress) {
  41.                                 p_array[i].push(getcode(myBitmap.getPixel(i+1, j+1)));
  42.                         } else {
  43.                                 p_array[i].push(myBitmap.getPixel(i+1, j+1));
  44.                         }
  45.                 }
  46.         }
  47. }
  48. save2array();
  49. trace("转换时间: "+(getTimer()-timer)+" ms");
  50. //分隔符要用那些没有做在进制字符的
  51. var my_data:String = max_w+","+max_h+"=";
  52. //trace(my_data);
  53. my_data += p_array.join(",");
  54. trace("字符长度:"+my_data.length);
  55. //字符长度
  56. //我的测试数据:
  57. //false:302419
  58. //true:147174
  59. //trace(my_data);
复制代码


执行时间不多,对于程序的有效行比较好。
大家可以看一下代码的执行效果

进阶压缩的原理:

'c,'c,'c,'c,'c,Eg,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,Eg,Eg,Eg,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,'c,


看到上面的数据了,对于重复的点,可以考虑这样处理:

'c(5),Eg,'c(10),Eg,Eg,Eg,'c(15),


这个算法需要再对数组处理,本人未写出,提高的压缩比率是客观的。
当然"()"需要在后期先处理,把"()"的多个字符先行恢复。

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,


对于上面字符,可以看出来,如果相片偏暗,以黑色为基点运算就好,相片偏亮,则适宜以白色为基点运算。

分段压缩的算法效率不大,毕竟现在已经是三个字符表示了,如果分区间,可以用两个字符表示颜色,但是还要用一个字符表示区间。


图片压缩方法

相邻的点的颜色一样,采用"(个数)"表示
如果颜色相差不大,差值为n,则在二维数组中进行比较,把某些点近似为该点,这样就有更多的个数了,字符数量就更加少。

[ 本帖最后由 hqlulu 于 2006-12-5 10:44 编辑 ]
已有 2 人评分威望 收起 理由
mirycat + 3 精品文章
HBrO + 2 精品文章

总评分: 威望 + 5   查看全部评分

阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com
西部数码顶级域名注册商39元抢注!
帖子
1396
体力
6754
威望
6
居住地
江苏省 苏州市
发表于 2006-12-5 09:44:10 |显示全部楼层
强啊!不过一时间还理解不了,得慢慢看了!
租服务器,上51IDC | [长沙]招聘:PHP经理10K/WEB前端6K/PHP开发6K

使用道具 举报

紫极光

钻石会员

帖子
1829
体力
9429
威望
1
发表于 2006-12-5 10:22:19 |显示全部楼层
这个算法.就是把上次讨论的一些压缩算法都结合进去了的混合算法了.呵呵...不知道有没有更高效率的算法.呵呵...毕竟200*200也不是很大的图片..呵呵....
~FOREVER HOT~
http://www.shinez23.cn/ --- 紫*极光

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 10:37:51 |显示全部楼层
具有压缩和高阶压缩选择方式的开关

高阶压缩是有效的,拿最小的数字来说,表示两个需要四个字符 0,0,
压缩后是 0(2), 多一个字符,三个数字以上就小了,如果是需要两个字符表示的,那就肯定压缩了

  1. //program by hqlulu
  2. //www.aslibra.com
  3. //
  4. import flash.display.BitmapData;
  5. //自定义宽和高
  6. var max_w:Number = 200;
  7. var max_h:Number = 200;
  8. var myBitmap:BitmapData = new BitmapData(max_w, max_h, true, 0x000000);
  9. myBitmap.draw(_root);
  10. view_mc.attachBitmap(myBitmap, 10);
  11. //是否压缩
  12. //我的测试数据:
  13. //more:1636 ms
  14. //true:1382 ms
  15. //false:364 ms
  16. var is_compress:Boolean = true;
  17. var is_more_compress:Boolean = true;
  18. //
  19. //定义进制字符,在这里差不多把所有的字符用上了,用的越多压缩越好,不过选择ffffff所达到的字符数最好
  20. //这里对于图片加密也有很大的帮助!
  21. var code:String = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+'";
  22. var code_array:Array = code.split("");
  23. //多少个字符就是多少进制了
  24. var byte:Number = code.length;
  25. function getcode(i:Number):String {
  26.         //取整求余法进行进制转换
  27.         var return_code:String = "";
  28.         while ((i=Math.ceil(i/byte))>byte) {
  29.                 return_code = code_array[i%byte]+return_code;
  30.         }
  31.         return_code = code_array[i]+return_code;
  32.         return return_code;
  33. }
  34. //
  35. //记录的数组
  36. var p_array:Array = new Array();
  37. var final_array:Array = new Array();
  38. var timer:Number = getTimer();
  39. function save2array():Void {
  40.         for (var i:Number = 0; i<max_w; i++) {
  41.                 for (var j:Number = 0; j<max_h; j++) {
  42.                         p_array.push(myBitmap.getPixel(i+1, j+1));
  43.                 }
  44.         }
  45.         var tmp_num:Number = p_array[0];
  46.         var tmp_counter:Number = 0;
  47.         if (is_compress) {
  48.                 //选择普通压缩
  49.                 var p_length:Number = p_array.length;
  50.                 for (var i:Number = 0; i<p_length; i++) {
  51.                         if (is_more_compress) {
  52.                                 //选择再次压缩
  53.                                 if (p_array[i] == tmp_num && i != p_length-1) {
  54.                                         //计数,如果是最后一个数字,需要在下面做一次整合
  55.                                         tmp_counter++;
  56.                                         continue;
  57.                                 } else {
  58.                                         //判断重复个数
  59.                                         var tmp_str:String = "";
  60.                                         if (tmp_counter>0) {
  61.                                                 tmp_str = "("+tmp_counter+")";
  62.                                         }
  63.                                         final_array.push(getcode(tmp_num)+tmp_str);
  64.                                         //相关数据复原
  65.                                         tmp_counter = 0;
  66.                                         tmp_num = p_array[i];
  67.                                 }
  68.                         } else {
  69.                                 //不选择再次压缩
  70.                                 final_array[i] = getcode(p_array[i]);
  71.                         }
  72.                 }
  73.         }
  74. }
  75. save2array();
  76. //图片参数,解压的时候需要
  77. var my_data:String = max_w+","+max_h+","+int(is_compress)+","+int(is_more_compress)+"=";
  78. //trace(my_data);
  79. my_data += final_array.join(",");
  80. trace("转换时间: "+(getTimer()-timer)+" ms");
  81. //分隔符要用那些没有做在进制字符的
  82. trace("字符长度:"+my_data.length);
  83. //trace(final_array);
  84. //字符长度
  85. //我的测试数据:
  86. //false:302419
  87. //true:147174
  88. //more:130120
  89. //trace(my_data);
复制代码

[ 本帖最后由 hqlulu 于 2006-12-5 10:48 编辑 ]
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 10:39:48 |显示全部楼层
占位:php解码出图像

最简单的保存方法:

  1. <?php
  2. $pic_str=$_POST["pic"];
  3. $myfile=time().".txt";
  4. $fp=@fopen($myfile,"w");
  5. fwrite($fp,$pic_str);
  6. fclose($fp);
  7. chmod ($myfile, 0777);
  8. ?>
复制代码

[ 本帖最后由 hqlulu 于 2006-12-5 12:12 编辑 ]
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

帖子
137
体力
332
威望
3
发表于 2006-12-5 14:15:29 |显示全部楼层
顶, 200*200  1 秒已经可以使用了

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 15:40:19 |显示全部楼层
原帖由 jackgun 于 2006-12-5 14:15 发表
顶, 200*200  1 秒已经可以使用了


发觉转换进制可能有bug,稍后处理一下,也许得多一位
这个就比较麻烦了
不过我感觉这里一个最大的好处就是图片加密
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 16:41:46 |显示全部楼层
由于进制转换的函数我搞错了,少了一个字符,所以数据增大了些,最新的比较数据:

之前的错误数据

未压缩文本:295k
压缩文本:143k
高阶压缩:127k
BMP图片(200*200一样的图片):117k

  1. 修正后的数据

  2. 未压缩文本:295k
  3. 压缩文本:182k
  4. 高阶压缩:157k
  5. BMP图片(200*200一样的图片):117k
  6. rar打包的大小是:63.7k
  7. (看来还是有一个很好的目标了,:D )
复制代码


修正后的代码:

  1. //program by hqlulu
  2. //www.aslibra.com
  3. //
  4. import flash.display.BitmapData;
  5. //自定义宽和高
  6. var max_w:Number = 200;
  7. var max_h:Number = 200;
  8. var myBitmap:BitmapData = new BitmapData(max_w, max_h, true, 0x000000);
  9. myBitmap.draw(_root);
  10. view_mc.attachBitmap(myBitmap, 10);
  11. //是否压缩
  12. //我的测试数据:
  13. //more:1582 ms
  14. //(高阶压缩似乎执行时间比不使用要少,我纳闷了)
  15. //true:1643 ms
  16. //false:422 ms
  17. var is_compress:Boolean = true;
  18. var is_more_compress:Boolean = true;
  19. //
  20. //定义进制字符,在这里差不多把所有的字符用上了,用的越多压缩越好,不过选择ffffff所达到的字符数最好
  21. //这里对于图片加密也有很大的帮助!
  22. var code:String = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+`";
  23. var code_array:Array = code.split("");
  24. //多少个字符就是多少进制了
  25. var byte:Number = code.length;
  26. function getcode(i:Number):String {
  27.         //取整求余法进行进制转换
  28.         var return_code:String = code_array[i%byte];
  29.         while ((i=Math.floor(i/byte))>byte) {
  30.                 return_code = code_array[i%byte]+return_code;
  31.         }
  32.         return_code = code_array[i]+return_code;
  33.         return return_code;
  34. }
  35. //测试一下最高的颜色
  36. var num = Number(0xffffff);
  37. trace(getcode(num));
  38. //
  39. //记录的数组
  40. var p_array:Array = new Array();
  41. var final_array:Array = new Array();
  42. var timer:Number = getTimer();
  43. function save2array():Void {
  44.         for (var i:Number = 0; i<max_w; i++) {
  45.                 for (var j:Number = 0; j<max_h; j++) {
  46.                         //这里不加判断的话,速度可以提高些
  47.                         p_array.push(myBitmap.getPixel(i+1, j+1));
  48.                 }
  49.         }
  50.         var tmp_num:Number = p_array[0];
  51.         var tmp_counter:Number = 0;
  52.         if (is_compress) {
  53.                 //选择普通压缩
  54.                 var p_length:Number = p_array.length;
  55.                 for (var i:Number = 0; i<p_length; i++) {
  56.                         if (is_more_compress) {
  57.                                 //选择再次压缩
  58.                                 if (p_array[i] == tmp_num && i != p_length-1) {
  59.                                         //计数,如果是最后一个数字,需要在下面做一次整合
  60.                                         tmp_counter++;
  61.                                         continue;
  62.                                 } else {
  63.                                         //判断重复个数
  64.                                         var tmp_str:String = "";
  65.                                         if (tmp_counter>0) {
  66.                                                 tmp_str = "("+tmp_counter+")";
  67.                                         }
  68.                                         final_array.push(getcode(tmp_num)+tmp_str);
  69.                                         //相关数据复原
  70.                                         tmp_counter = 0;
  71.                                         tmp_num = p_array[i];
  72.                                 }
  73.                         } else {
  74.                                 //不选择再次压缩
  75.                                 final_array[i] = getcode(p_array[i]);
  76.                         }
  77.                 }
  78.         } else {
  79.                 final_array = p_array;
  80.         }
  81. }
  82. save2array();
  83. //图片参数,解压的时候需要
  84. var my_data:String = max_w+","+max_h+","+int(is_compress)+","+int(is_more_compress)+"=";
  85. //trace(my_data);
  86. my_data += final_array.join(",");
  87. trace("转换时间: "+(getTimer()-timer)+" ms");
  88. //分隔符要用那些没有做在进制字符的
  89. trace("字符长度:"+my_data.length);
  90. //trace(final_array);
  91. //字符长度
  92. //我的测试数据:
  93. //false:302423
  94. //true:187178
  95. //more:161413
  96. //trace(my_data);
  97. //
  98. //send data
  99. if (0) {
  100.         var a_lv:LoadVars = new LoadVars();
  101.         a_lv.pic = my_data;
  102.         a_lv.sendAndLoad("http://192.168.1.27/test/flash_pic/save.php", a_lv, "post");
  103.         a_lv.onLoad = function() {
  104.                 trace("ok");
  105.         };
  106. }
复制代码
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 16:46:34 |显示全部楼层

php文件的读写程序

save.php

  1. <?php
  2. $pic_str=$_POST["pic"];
  3. $myfile=time().".txt";
  4. $fp=@fopen($myfile,"w");
  5. fwrite($fp,$pic_str);
  6. fclose($fp);
  7. chmod ($myfile, 0777);
  8. ?>
复制代码



读取并且解码的程序

  1. <?php
  2. // program:hqlulu
  3. // http://www.aslibra.com
  4. //
  5. $myfile="1165306222.txt";
  6. $code = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+`";
  7. $byte=$code_len=strlen($code);

  8. //处理反转索引
  9. $code_array=array();
  10. for($i=0;$i<$code_len;$i++)
  11. array_push($code_array,$code[$i]);
  12. $code_array=array_flip($code_array);

  13. //读取文件内容
  14. $pic = file_get_contents($myfile);
  15. $pic_array=explode("=",$pic);

  16. //定义编码
  17. function getcode($i) {
  18.         global $code,$byte;

  19.         //取整求余法进行进制转换
  20.         $return_code = $code[$i%$byte];
  21.         while (($i=floor($i/$byte))>$byte) {
  22.                 $return_code = $code[$i%$byte].$return_code;
  23.         }
  24.         $return_code = $code[$i].$return_code;
  25.         return $return_code;
  26. }

  27. //定义解码
  28. function encode($str)
  29. {
  30.         global $code_len,$code_array;

  31.         $len=strlen($str);
  32.         $str1=0;
  33.         for($i=0;$i<$len;$i++)
  34.         {
  35.                 $top=$len-$i-1;
  36.                 $str1+=$code_array[$str[$i]]*pow($code_len,$top);
  37.         }
  38.         return $str1;
  39. }

  40. //分离宽高和压缩参数
  41. $sizes=explode(",",$pic_array[0]);
  42. $width                                =$sizes[0];
  43. $height                                =$sizes[1];
  44. $compress                        =$sizes[2];
  45. $more_compress        =$sizes[3];

  46. //取得数据
  47. $tmp_array=explode(",",$pic_array[1]);
  48. $tmp_str="";

  49. //复原进制压缩
  50. if($compress)
  51. {
  52.         //复原高阶压缩
  53.         if($more_compress)
  54.         {
  55.                 foreach ($tmp_array as &$v) {
  56.                         $pattern="(.{1,3})\(([0-9]{1,9})\)";
  57.                         if (ereg($pattern, $v, $regs)) {
  58.                                 $regs[1]=encode($regs[1]);
  59.                                 $v=ereg_replace($pattern, str_repeat(",".$regs[1],$regs[2]), $v);
  60.                         }
  61.                         else
  62.                         {
  63.                                 $v=encode($v);
  64.                                 $v=",".$v;
  65.                         }
  66.                 }
  67.                 $tmp_str=implode("",$tmp_array);
  68.         }
  69.         else
  70.         {
  71.                 foreach ($tmp_array as &$v) {
  72.                         $v=encode($v);
  73.                 }
  74.                 $tmp_str=implode(",",$tmp_array);
  75.         }
  76. }

  77. //复原点阵
  78. $myfile="-".$myfile;
  79. $fp=@fopen($myfile,"w");
  80. fwrite($fp,$tmp_str);
  81. fclose($fp);

  82. ?>
复制代码
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-5 16:47:48 |显示全部楼层
php程序生成图片代码

(稍后给出……)
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

xfys 
帖子
106
体力
273
威望
0
发表于 2006-12-5 18:33:22 |显示全部楼层
亲吻swf能不能自己截图?就是抓取制定swf矩形区域内的图像为gif惑jpg???然后存到硬盘?

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-6 13:49:17 |显示全部楼层
可以截图,但是生成图片还是需要别的工具来协助进行

原帖由 xfys 于 2006-12-5 18:33 发表
亲吻swf能不能自己截图?就是抓取制定swf矩形区域内的图像为gif惑jpg???然后存到硬盘?
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

帖子
1219
体力
5975
威望
234
发表于 2006-12-6 13:50:22 |显示全部楼层
太好了!
这个太需要了!
我曾经苦恼于庞大的BitmapData输出!

使用道具 举报

hqlulu 楼主

阿权

钻石会员

帖子
1959
体力
6564
威望
59
发表于 2006-12-7 16:17:52 |显示全部楼层
原帖由 awflasher 于 2006-12-6 13:50 发表
太好了!
这个太需要了!
我曾经苦恼于庞大的BitmapData输出!


生成图片的程序暂时没有兴趣写了
等以后再说吧
具体压缩方式可以查看一下之前的帖子,也不错的
这里的可以选择自己加密,比较有意思
阿权的书房:摄影/杂记/PHP/Linux
http://www.asLibra.com

使用道具 举报

FlashK 
帖子
553
体力
2405
威望
82
发表于 2006-12-9 10:52:59 |显示全部楼层
很不错的东东哦,更进步了~`
欢迎来我的全Flash站收藏:http://www.flashk3.com/

使用道具 举报

我是棉花糖

银牌会员

帖子
936
体力
2563
威望
6
发表于 2006-12-22 12:45:02 |显示全部楼层
  1. //  摘自 LZW.as
  2. //  URL http://www.razorberry.com/blog/archives/2004/08/22/lzw-compression-methods-in-as2
  3. ...
  4. var dico:Array = new Array();
  5. for (var i = 0; i < 256; i++)
  6. {
  7.         dico[String.fromCharCode(i)] = i;
  8. }
  9. ...
复制代码

使用道具 举报

帖子
106
体力
601
威望
20
发表于 2007-1-3 20:21:35 |显示全部楼层
放个书签, 慢慢学习!

使用道具 举报

kolou 

死神

银牌会员

帖子
3937
体力
1579
威望
15
居住地
上海市 卢湾区
发表于 2007-1-24 22:32:27 |显示全部楼层
楼主是否能给出PHP生成PNG的代码呢

==~~ 实在是不知道改怎么弄  要么给点提示?

使用道具 举报

小力

银牌会员

帖子
449
体力
2297
威望
9
发表于 2007-1-25 12:38:55 |显示全部楼层
编码函数似乎还有个BUG哦 修正了下
var byte:Number = code.length;
function getCode(i):Number {
        var _str:String = "";
        while (i>=byte) {
                _str=code_array[i%byte]+_str;
                i=Math.floor(i/byte);
        }
        _str=code_array[i%byte]+_str;
        return _str;
}

使用道具 举报

kita32 
帖子
368
体力
784
威望
1
发表于 2007-7-30 11:18:29 |显示全部楼层
别怪我顶老贴 虽然我知道这贴不少人收藏了 但我还是要批批  得罪了
不知道楼主是否看过 aspx 输出的数据没有  
flash输出

var code:String = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+'";

到了 aspx 就变成  

{code=0123456789qwertyuiop%5b%5dasdfghjkl%3bzxcvbnm.%2fQWERTYUIOP%7b%7d%7cASDFGHJKL%3aZXCVBNM%3c%3e%3f%7e!%40%23%24%25%5e%26*()_%2b%60}

看到了问题了吗???   长度几乎多出一倍

也就是说  很多字符看上去是一个长度  实际上出来是 %??  三个单位的长度
用这样的字符不但不会缩小数据体积  而且会把数据变得更长

因此我筛选了一下

0123456789qwertyuiopasdfghjklzxcvbnm.QWERTYUIOPASDFGHJKLZXCVBNM!*()_

这才是实际数据长度为一的字符
一共才 69 个
(% 如果你冒险敢用 那也算70个)

PS: 楼主从第一部  getCode 就开始错了 进制的计算大家好好想想

[ 本帖最后由 kita32 于 2007-7-30 11:26 编辑 ]
做人还是低调点好。。。

使用道具 举报

kita32 
帖子
368
体力
784
威望
1
发表于 2007-7-30 12:30:39 |显示全部楼层
更新一下

0123456789abcdefghijklmnopqrstuvwXyzABCDEFGHIJKLMNOPQRSTUVWXYZ.!*()_-'

70个 不用转换 GB 或者 UTF-8 就能个识别的字符
除了这70个 使用更多字符耗无意义
做人还是低调点好。。。

使用道具 举报

kita32 
帖子
368
体力
784
威望
1
发表于 2007-7-30 15:11:11 |显示全部楼层
import flash.display.BitmapData;

var bmd:BitmapData = new BitmapData (320, 240, false, 0x00000000);
bmd.draw (pic);
var CodeS:String = "0123456789abcdefghijklmnopqrstuvwXyzABCDEFGHIJKLMNOPQRSTUVWXYZ.!*()_'";

function GP (BMD:BitmapData):String
{
        var Code:Array = CodeS.split ("");
        var Len:Number = Code.length;
        var mybmd:BitmapData = BMD;
        var w:Number = BMD.width;
        var h:Number = BMD.height;
        var i:Number = 0;
        var j:Number = w*h;
        var mystring = new String ();
        for (i=0; i<j; i++)
        {
                var k:Number = i%w;
                var color:Number = mybmd.getPixel (k, (i-k)/w);
                var tmpS:String = new String ();
                while (color != 0)
                {
                        var tmpN:Number = color%Len;
                        tmpS = Code[tmpN]+tmpS;
                        //tmpS = String(tmpN)+tmpS;
                        color = (color-tmpN)/Len;
                }
                mystring += tmpS+"-";
        }
        //+'-'
        mybmd.dispose ();
        BMD.dispose ();
        delete Code;
        delete BMD;
        delete mybmd;
        delete tmpN;
        delete tmpS;
        delete color;
        return mystring;
}


这是我的代码  原数据 (10进制) 620.497KB  新编码数据 (70进制) 383.992KB  耗时 2229
charAt 太慢了 所以用了 Array

[ 本帖最后由 kita32 于 2007-7-30 15:56 编辑 ]
做人还是低调点好。。。

使用道具 举报

帖子
167
体力
709
威望
0
居住地
广东省 广州市
发表于 2007-8-7 14:09:16 |显示全部楼层

22楼的似乎没反应哦!

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

Archiver|手机版|安久科技提供CDN|blueidea.com ( 京ICP备05002321号 )  

GMT+8, 2012-2-13 12:01 , Processed in 0.274931 second(s), 11 queries , Gzip On, Memcache On.

Powered by Discuz! X2

© 2001-2011 Comsenz Inc.

回顶部