您的位置: 首页 > 技术文档 > 多媒体制作 > Flash AS2 中的拍照图片无损压缩
回到列表 使用 Flex 上传文件
用户名:
密 码: 忘记密码
注册会员 游览论坛 论坛帮助
 Flash AS2 中的拍照图片无损压缩

作者:hqlulu 时间: 2006-12-22 文档类型:原创 来自:蓝色理想
浏览统计 total:1938 | year:242 | Quarter:242 | Month:242 | Week:242 | today:2

看过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进制更短,那用尽量大的进制则字符越少。

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

先说一下本次的算法:

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

import flash.display.BitmapData;
//自定义宽和高
var max_w:Number = 200;
var max_h:Number = 200;
var myBitmap:BitmapData = new BitmapData(max_w, max_h, true, 0x000000);
myBitmap.draw(_root);
view_mc.attachBitmap(myBitmap, 10);
//是否压缩
//我的测试数据:
//true:1382 ms
//false:364 ms
var is_compress:Boolean = true;
//
//定义进制字符,在这里差不多把所有的字符用上了,用的越多压缩越好,不过选择ffffff所达到的字符数最好
//这里对于图片加密也有很大的帮助!
var code:String = "0123456789qwertyuiop[]asdfghjkl;zxcvbnm./QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?~!@#$%^&*()_+'";
var code_array:Array = code.split("");
//多少个字符就是多少进制了
var byte:Number = code.length;
function getcode(i:Number):String {
    //取整求余法
    var return_code:String = "";
    while ((i=Math.ceil(i/byte))>byte) {
        return_code += code_array[i%byte];
    }
    return_code += code_array[i];
    return return_code;
}
//
//记录的数组
var p_array:Array = new Array();
var timer:Number = getTimer();
function save2array():Void {
    for (var i:Number = 0; i<max_w; i++) {
        p_array[i] = new Array();
        for (var j:Number = 0; j<max_h; j++) {
            //这里不加判断的话,速度可以提高些
            if (is_compress) {
                p_array[i].push(getcode(myBitmap.getPixel(i+1, j+1)));
            } else {
                p_array[i].push(myBitmap.getPixel(i+1, j+1));
            }
        }
    }
}
save2array();
trace("转换时间: "+(getTimer()-timer)+" ms");
//分隔符要用那些没有做在进制字符的
var my_data:String = max_w+","+max_h+"=";
//trace(my_data);
my_data += p_array.join(",");
trace("字符长度:"+my_data.length);
//字符长度
//我的测试数据:
//false:302419
//true:147174
//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,则在二维数组中进行比较,把某些点近似为该点,这样就有更多的个数了,字符数量就更加少。

经典论坛讨论
http://bbs.blueidea.com/thread-2700451-1-1.html

出处:蓝色理想
责任编辑:blue

◎进入论坛Flash专栏版块参加讨论

相关文章 更多相关链接
MAMA快乐的图片日记
使用 Flex 上传文件
FLASH与ASP通信原理入门
FLASH基础开发习惯
用background 插入flash播放器
热门搜索:CSS Fireworks 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
熊猫烧香图标病毒
寻找07年中国50位优秀网页设计师
上海老弄堂里的邻家少女Melody
光线也疯狂
用Photoshop做脸部美容
登封政府门户网站新版发布
Fireworks抠图之枝繁叶茂的树木
Google 百度 搜索引擎习惯的分析
网页制作前台之javascript
《Flash网站建设技术精粹》
栏目最新 栏目最新列表
用Photoshop做脸部美容
Fireworks抠图之枝繁叶茂的树木
Google 百度 搜索引擎习惯的分析
网页制作前台之javascript
苹果图标制作——组合的技巧
数据对象类表单自动绑定
苹果图标制作——立体化图标
苹果图标制作——形状的建立
Flash AS2 中的拍照图片无损压缩
用Photoshop打造ipod nano

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

本文暂时没有评论和评分

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
Don't Make Me Think 第2版
《Flash第一步系列》
《交互设计之路》
《Dreamweaver 从基础到实践》
《色彩管理》
《情感化设计》
《GUI设计禁忌》