ddc
联网
平面设计 画册 VI欣赏 包装 CG-插画 搜索 个人网页 Alexa排名 CSS 建站资源 下载专区 JS特效 品牌服装 服装院校 专题欣赏 SEO 图标欣赏 专题
上海网站建设 网站建设 域名注册 虚拟主机 广州网站设计 域名注册 广州网站建设 上海网站建设 虚拟主机 广州网页设计 虚拟主机 域名注册 acg ACG玩家 品牌设计
求创科技
网站建设
中国互联
投稿
素材出售
中国设计秀
中资源
当前位置:网络学院首页 >> 设计教程 >> Flash >> Flash AS2 中的拍照图片无损压缩

Flash AS2 中的拍照图片无损压缩

来源:中国设计秀    作者:    点击:30     加入收藏    发表评论
0
顶一下

我们都说无损压缩吧,保留点阵数据。
此法压缩的数据已经接近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,则在二维数组中进行比较,把某些点近似为该点,这样就有更多的个数了,字符数量就更加少。

2006-12-29 17:21:00    出处:webjx
Google
热点文章/相关文章

音乐
嫁衣 画心 放生 天亮了 牡丹江 那滋味 擦肩而过 怀念过去 北京欢迎你 突然好想你 吻的太逼真 说好的幸福呢 坐上火车去拉萨 没有人比我更爱你
愚爱 心碎 稻香 带我走 醉赤壁 魔杰座 我还想她 明天过后 一定要爱你 等爱的玫瑰 原谅我一次 越单纯越幸福 最后一次的温柔 给我一首歌的时间
白狐 光荣 降临 下雨天 小酒窝 樱花草 恋爱新手 说唱脸谱 红色高跟鞋 寂寞才说爱 深深爱过你 爱上你是个错 即使知道要见面 不是因为寂寞才想你
城府 假如 花海 兰亭序 棉花糖 舍不得 最后一次 女人如烟 外滩十八号 我们的纪念 我们的无奈 心在跳情在烧 爱上你是我的错 爱情里没有谁对谁错
网站地图 | 关于我们 | 联系我们 | 网站建设 | 广告服务 | 版权声明 | 免责声明 | 网站公告 | 友情链接 | 留言 | 旧版入口