打印

[编程] Flash AS2 中的拍照图片传输量太大的解决思路

原理就是将flash中BitmapData中得到的RGB编码成字符串(XML),然后在服务器端进行反解码。

可惜我不会服务器端的,有兴趣的可以来玩玩~`
开始。
我们利用Flash的Bitmap来抓拍一个当前MC中的位图数据,然后输出。
ActionScript:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=NUM10 ]";
for (var i = 1; i<myBitmap.height; i++) {
    for (var j = 1; j<myBitmap.width; j++) {
        data += myBitmap.getPixel(i, j)+",";
    }
}
trace(data);
这样你就得到了类似下面的数据输出:
============
[bitmap width=400 height=300 sendBy=Flash Encode=NUM10 ]
16728576,16728576,16730112,16730112,16731648,16731648,16733440,16734976,16734976,16736512,16736512,16738048,16739584,16739584,16741120,16741120,16742656,16744192,16744192,16745728,16745728,16747264,16748800,16748800,16750336,16750336,16751872,16751872,16753408,16755200,16755200,16756736,16756736,16758272,16759808,16759808,16761344,16761344,16762880,16764416,16764416,16765952,16765952,16767488,16769024,16769024,16770560,16770560,16772096,16772096,16773632,16775168,16775168,16776960,16776960,16449280,16121600,16121600,15793920,16728576,16730112,16730112,

这样每一个以“,”分隔就是每一个像素的RGB值。(其实“,”分隔符是可以去掉的,也不必去标明每个像素位置,因为位图数据都是以一行一行的流记录的,每个像素占的字节数也是相同,记得以前学设计的时候书上好像是这么说的。。)
(这里为了可读性,没有去掉“,”分隔符,实际用的时候你将它去掉,下同)
事实上这样的数据量是很大的,以一个二进制文件为例,对比一下,一个二进制的60*60的bmp文件是11K左右,而以这样的数据来保存的文件在28K左右。差不多是3倍。而一个320*240的图像则会达到600多K,400*300则可能会到1M左右(这是不可想象的...)

其实这些数据都是以字符串发送的,它并不是数字或者二进制,而Flash又只能发送字符串(其它网页的东东好像也一样),那怎么办呢?
那就要换个思路了,我们要充分利用字符串。(其实字符串也是以二进制在网上传输的)
我们知道字符串不只只是只有0-9这几个数字。也就是说一个超过10的数字,你也能在字符串里找到一个和它对应的字符。这就是将RGB数值映射到字符串中去。一个字符就可以表示10以外的数,这样一来就可以减小文件大小。

我们来改一下我们的ActionScript:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=NUM16 ]";
for (var i = 1; i<myBitmap.height; i++) {
    for (var j = 1; j<myBitmap.width; j++) {
        data += myBitmap.getPixel(i, j).toString(16)+",";
    }
}
trace(data);
这次我们得到了一个带字母的输出:
==============
[bitmap width=400 height=300 sendBy=Flash Encode=NUM16 ]
ff4200,ff4200,ff4800,ff4800,ff4e00,ff4e00,ff5500,ff5b00,ff5b00,ff6100,ff6100,ff6700,ff6d00,ff6d00,ff7300,ff7300,ff7900,ff7f00,ff7f00,ff8500,ff8500,ff8b00,ff9100,ff9100,ff9700,ff9700,ff9d00,ff9d00,ffa300,ffaa00,ffaa00,ffb000,ffb000,ffb600,ffbc00,ffbc00,ffc200,ffc200,ffc800,ffce00,ffce00,ffd400,ffd400,ffda00,ffe000,ffe000,ffe600,ffe600,ffec00,ffec00,fff200,fff800,fff800,ffff00,ffff00,faff00,f5ff00,f5ff00,f0ff00,ff4200,ff4800,ff4800,ff4e00,ff5500,ff5500,ff5b00,ff5b00,

做过网页的朋友应该很清楚。这个就是网页颜色的十六进制码。我们用了一个Flash内置的函数toString(16)将得到的RGB数字转成带字母A,B,C、D,E,F的十六进制字符。
在十六进制中,字母A-F表示10-15这6个数。

对比一下刚刚的数据。16728576它占了8个字符。这次我们ff4200只用了6个字符就表示了它(这个可以反过来还原成刚刚的数),这样一来数据大小就减小了1/4。

[ 本帖最后由 FlashK 于 2006-11-25 00:38 编辑 ]
本帖最近评分记录
  • mirycat 威望 +4 精品文章 2006-12-2 12:44
欢迎来我的全Flash站收藏:http://www.flashk3.com/
再来改进一下我们的ActionScript:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
for (var i = 1; i<myBitmap.height; i++) {
    for (var j = 1; j<myBitmap.width; j++) {
        var num = myBitmap.getPixel(i, j);
        data += String.fromCharCode(num);
    }
}
这次我们用了Number内置的toString(36)的来将我们的RGB数字转成由0-9和A-Z共36种字符表示的字符串。
(为什么用内置的是因为它比较快,也方便)

现在的输出是这样子的:
========
[bitmap width=400 height=300 sendBy=Flash Encode=NUM36 ]
9yjuo,9yjuo,9yl1c,9yl1c,9ym80,9ym80,9ynls,9yosg,9yosg,9ypz4,9ypz4,9yr5s,9yscg,9yscg,9ytj4,9ytj4,9yups,9yvwg,9yvwg,9yx34,9yx34,9yy9s,9yzgg,9yzgg,9z0n4,9z0n4,9z1ts,9z1ts,9z30g,9z4e8,9z4e8,9z5kw,9z5kw,9z6rk,9z7y8,9z7y8,9z94w,9z94w,9zabk,9zbi8,9zbi8,9zcow,9zcow,9zdvk,9zf28,9zf28,9zg8w,9zg8w,9zhfk,9zhfk,9zim8,9zjsw,9zjsw,9zl6o,9zl6o,9skcg,9lji8,9lji8,9eio0,9yjuo,9yl1c,9yl1c,9ym80,

这一次我们只用了五个字符来表示刚刚8个表示的RGB值。(比十六制的还要少)

还能不能再压缩呢?当然还能,事实上,应该可以达到和二进制文件一样的大小。

我们知道字符串在Flash中是以UTF-8传递的(还记得Flash6的那个乱码问题吗,当时确实很头疼的,不过现在8用起来不错)
怎么样将RGB数字编码成UTF-8字符串呢?幸好Flash还有个fromCharCode(num);它将返回一个由参数中的 Unicode 值表示的字符组成的字符串。

ActionScript:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=60 height=60 ]";
for (var i = 1; i<myBitmap.height; i++) {
    for (var j = 1; j<myBitmap.width; j++) {
        var num = myBitmap.getPixel(i, j);
        data += String.fromCharCode(num)+",";
    }
}
trace(data);
现在输出:
===============
[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]
唔,吓,䬍,䐇,㨁,㐁,㐁,㄀,㄀,⸀,⸀,㜀,㔁,㔇,㐉,ㄏ,】,⨊,☂,⌀,␀,⌀,␄,⌂,␀,━,│,┇,☂,✃,⠅,☃,␄,⌅,␁,␀,⨅,⨆,∄,∆,┑,Ḉ,᠂, , ,⌈,∆,℅,ḃ,ἃ,ἃ,℄, ,ḃ,ᴃ,ἃ,ἀ,∁,⬋,圓,嘕,吔,匓,刔,伔,伔,䰑,䨏,䜎,䜎,䌍,㤊,㈆,Ⰵ,★,☇,⤆,⨆,✂,␀,⠆,Ⰶ,⸅,⼄,㈅,㈈,㌍,㘔,㈐,⤇,✅,☄,⌁,✉, ,␄,☈,Ⱃ,㌛,躁,邁,楘,⠓,␏,Ἄ,ḋ,Ḋ,ḅ, ,℅,∅, ,∆,┇,⨉,㈌,『,㌒,圉,吒,吒,唎,后,刑,不,不,們,䨑,䜎,丘,㴊, ,⨀,ⴃ,⨃,␀,⤄,ⴉ,⸉,⼊,ㄋ,㌍,㐊,㐈,㐊,ㄉ,㘐,ⴇ,☂,✃,⌃,┅,⠂,⤋,☆,⤆,⬓,幐,뚵,웄,릵,癮,剆,⨙,‍,ᜂ,┍,Ḇ,ᤁ, ,⌇,✇,

这里我们将RGB的颜色转成一个Unicode的字符串。这样就将每个像素的RGB映射到了一个字符串中。
(事实上我对能不能将16777215色彩映射到UTF-8中感到有怀疑,回头好好研究一下)

这段代码在我的P4 2.8G上面运行了3842ms左右的时间。而FlashPlayer的用户则可能会更慢(因为普通用户的电脑可能会差一点,而且Flash也不可能多台电脑一起,速度至上啊,是不是)。
我们的用户可能要花上7-10秒(视CPU速度,它的运算量是一定的)的时间来完成上面的运算。太慢了,是不是?

让我们来好好优化一下代码来提高速度:
ActionScript改成这样:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
for (var i = 1; i<300; i++) {
    for (var j = 1; j<400; j++) {
        var num = myBitmap.getPixel(i, j);
        data += String.fromCharCode(num);
    }
}
或者:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
var width = myBitmap.width;
var height = myBitmap.height;
for (var i = 1; i<height; i++) {
    for (var j = 1; j<width; j++) {
        var num = myBitmap.getPixel(i, j);
        data += String.fromCharCode(num);
    }
}
这一次,我们将运算速度提到了3599ms左右。你也可以在你的电脑上试试。

如果有人不知道如何测试代码运算速度,可以看看这个。就以上面的代码为例:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
timer = getTimer();
for (var i = 1; i<300; i++) {
    for (var j = 1; j<400; j++) {
        var num = myBitmap.getPixel(i, j);
        data += String.fromCharCode(num);
    }
}
trace(getTimer()-timer);
[ 本帖最后由 FlashK 于 2006-11-26 14:25 编辑 ]
欢迎来我的全Flash站收藏:http://www.flashk3.com/
期待。。。
LZW 是一种无损压缩算法,GIF格式就是采用此种压缩算法。用楼主的原始数据经过 LZW for AS2 算法压缩后,只有原始尺寸的 1/3。

P.S: AS3 的 ByteArray 内已经内建了对 ZLIB 算法的支持,ZLIB 算法是 LZ77(即 LZW)算法的变种,被应用于 PNG 格式的压缩算法中。

[ 本帖最后由 abc12hjc 于 2006-11-25 00:43 编辑 ]

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
...厉害,,

TOP

LZW确实有时可以压得很低,不过这上面的例子比较特别。像这个:16736512,16736512 有两个像素是相同的。在最极端的情况下,如果整个画布都是一种颜色的话,就可以用16736512(168)这样的方法来描述。(表示后面有168个16736512这样的值)

GIF压缩我感觉是比较笨的。它只会对图像作横向压缩。如果是柱子它就不行了。LZW也可以用在最后压缩一次:)

PS:我在这贴子中只想弄一个当前在FlashPlayer8/AS2中一个可以普遍实用的解决方案。(我标明了AS2,呵呵~`)
解决下面的问题:
一、压缩文件大小。尽可能的支持更大的图片(最优先考虑)(不过大图片会更消耗CPU)
二、最大优化性能,使它能够实际使用(Flash很多东东好像很慢,就像这里的String)
二、如果有可能,考虑图像压缩算法(这个很头疼)


让我们来进一步优化我们的速度,ActionScript改成这样:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
function colorToString():Void {
    var width = myBitmap.width;
    var height = myBitmap.height;
    for (var i = 1; i<height; i++) {
        for (var j = 1; j<width; j++) {
            var num = myBitmap.getPixel(i, j);
            data += String.fromCharCode(num);
        }
    }
}
timer = getTimer();
colorToString();
trace(getTimer()-timer);
我们将一上面的代码写到一个function 中,这一次我们将速度优化到了2852ms左右。
快了很多,是不是?

不过这还不够,让我们继续优化速度。
ActionScript:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var data:String = "[bitmap width=400 height=300 sendBy=Flash Encode=UTF-8 ]";
function colorToString():Void {
    var a = data;
    var width = myBitmap.width;
    var height = myBitmap.height;
    for (var i = 1; i<height; i++) {
        for (var j = 1; j<width; j++) {
            var num = myBitmap.getPixel(i, j);
            a += String.fromCharCode(num);
        }
    }
    data = a;
}
timer = getTimer();
colorToString();
trace(getTimer()-timer);
这次,速度又有提升,所消耗的时间为1986ms

待续。。。

[ 本帖最后由 FlashK 于 2006-12-8 09:42 编辑 ]
欢迎来我的全Flash站收藏:http://www.flashk3.com/

TOP

还有一个方法啊……
记录第一个像素的颜色值,第二个开始计算与前一个像素的差值,如果颜色相同,那么差值为0,即只要发送一个字节就OK了。

[ 本帖最后由 meud 于 2006-11-25 04:31 编辑 ]
无能事即能无事,无事则无事事矣。
不可解亦可不解,不解以不解解之。

TOP

我汗..这样的帖子才是好帖子啊..我不太懂压缩方面呢.不过结合其它的Camera对象来用的话很不错呢...希望能有个好的结论出来..
我们拥有共同的梦想,在此刻我们相信永恒,我们相处的短暂时光,都将成为我们美好难忘的回忆.我相信,我们的誓言会成为永恒......
~FOREVER HOT~
http://myhot.0033.cn/ ----紫*极光

TOP

引用:
原帖由 meud 于 2006-11-25 04:29 发表
还有一个方法啊……
记录第一个像素的颜色值,第二个开始计算与前一个像素的差值,如果颜色相同,那么差值为0,即只要发送一个字节就OK了。
嗯~` 以后也考虑实现这个

[ 本帖最后由 FlashK 于 2006-11-26 13:40 编辑 ]
欢迎来我的全Flash站收藏:http://www.flashk3.com/

TOP

FlashK现在又开始研究图象和视频了,发现你研究什么都研究的很深啊,厉害!向你学习

TOP

好贴要顶啊

TOP

这些方法解决了到服务器端的数据传输量,不过却增加了客户端的负担。在客户端,光光执行图片的像素扫描都得花不少时间,如果再在其中增加这些算法,不知道如果要扫描一张大图,客户端得花多少时间处理,对于没什么耐心的网友而言,这种代价是否合适。。
还有一点,就是在扫描数据时,直接用嵌套for语句,在普通电脑上是不行的。前两天做了个320x240的扫描循环,我自己电脑是P42.4,1G内存,还好,只是执行时浏览器暂时呆掉,结果客户那边一用发现很多浏览器直接死掉(如果你做了一个扫描像素的进度条,那么实际执行时你会发现,也许进度条并不会如你所愿地显示),建议用enterframe或setInterval来替代其中一个循环,可以适当解决问题。
http://www.ui17.com你我一起

TOP

谁出来说说服务端怎么解决的吧
www.zhaohongri.com

TOP

你们现在讨论的两种方法(使用fromCharCode和LZW压缩)在我的blog里早就提出过了(http://www.weni.cn/index.php?play=reply&id=57),而且进行过试验了。
有兴趣的可以去看看。

TOP

使用大头贴最好的方案是使用as3,直接在客户端将拍出的画面编码成jpg或者png格式,再传到服务端,效率比as2的高n倍。。
我在 碰碰网(http://show.pengpeng.com/tt/) 开发的大头贴就是使用as3开发的 ,有兴趣的朋友可以去体验一下!

TOP

读图片的话,直接用for循环来做会造成客户端一下子的卡住,用户体验不是很好
孤域客的办法非常好,即使这样会慢一些,用户体验也会更好

TOP

虽然传输量减小了,但是客户端和服务器端的负荷都会增加。

TOP

我机测试最后端代码
1508ms
期待继续优化。。。

TOP

引用:
原帖由 weni 于 2006-11-27 14:33 发表
使用大头贴最好的方案是使用as3,直接在客户端将拍出的画面编码成jpg或者png格式,再传到服务端,效率比as2的高n倍。。
我在 碰碰网(http://show.pengpeng.com/tt/) 开发的大头贴就是使用as3开发的 ,有兴趣 ...
我上面的方案,由于直接在客户端生成图片,服务端根本没什么计算,只是纯粹的保存图片。从而没什么压力
客户端as3的运行效率是as2的几十倍,生成320×240的图片,普通计算机基本没上面延时,生成的jpg图片质量0.7的基本可以控制在30K左右。

TOP

@楼上:请仔细看楼主的标题

TOP

回复 #19 weni 的帖子

flash可以在客户端生成图片么,不行吧(编码),服务端还是有一定的压力的因为要写文件嘛

TOP

强啊,好贴必顶哈。希望楼主继续~
关于生命与花的寓言…

TOP

lz,能不能把swf中的一个mc的图像或者一个矩形区域[假设是100,100到300,300]的图像,抓拍下来,保存到本地硬盘?或者暂时存在swf中?

TOP

3楼正解,两年前我已经尝试过了。
还有一个思路,利用unicode写成gif或ipeg的字符串,提交给后台后改文件头后直接写二进制文件,这样做的好处就是负担全在客户端,服务器基本没有负担了。

TOP

回去查了一下,UTF-8只支持65536个字符,这样更麻烦了
这样一个字符串只能支持两个RGB分量的信息(RG或者GB)我们现在这样记录RGB信息:第一个字符串记录第一个像素的R和G信息,第二个字符串记录第一个像素的B和第二个像素的R,第三个字符串记录第二个像素的G和B信息。
依此类推。格式如下:
RG,BR,GB,RG,BR,GB,RG,BR,GB....

ActionScript改成这样:
复制内容到剪贴板
代码:
import flash.display.BitmapData;
var myBitmap:BitmapData = new BitmapData(400, 300, true, 0x00ffffff);
myBitmap.draw(_root);
b.attachBitmap(myBitmap, 10);
//
var charCode:Array = new Array("&#9730;");
for (var i = 0; i<256*256; i++) {
    charCode[i] = String.fromCharCode(i);
}
//
var data = "[bitmap width=400 height=300 ]";
function colorToString():Void {
    var preB = 0;
    var k = 1;
    var height = myBitmap.height;
    var width = myBitmap.width;
    var a = "";
    var ar = new Array();
    for (var i = 1; i<height; i++) {
        for (var j = 1; j<width; j++) {
            var color = myBitmap.getPixel(i, j);
            var B = color%256;
            var tmp = color-B;
            var G = (tmp/256)%256;
            var R = (tmp-G*256)/65536;
            k++;
            var t = k%2;
            if (t == 1) {
                var code = charCode[R*256+G];
                preB = B;
                a += code;
            } else {
                var code = charCode[preB*256+R];
                var code2 = charCode[G*256+B];
                a += code+code2;
            }
        }
    }
    data = a;
}
timer = getTimer();
colorToString();
trace(getTimer()-timer);
现在要开始自已取得RGB分量信息了.可以用这个代码来获得RGB的16进制信息,然后再每次取两个字符就行:
复制内容到剪贴板
代码:
        var num = myBitmap.getPixel(i, j).toString(16);
        var R = num.slice(0, 2);
        var G = num.slice(2, 4);
        var B = num.slice(4, 6);
不过这个速度太慢了,我们可以自已用数学运算来算,像下面的代码这样:
复制内容到剪贴板
代码:
        var color = myBitmap.getPixel(i, j);
        var R = Math.floor(color/65536);
        var G = Math.floor(color%65536/256);
        var B = color%256;
或者:
复制内容到剪贴板
代码:
        var color = myBitmap.getPixel(i, j);
        var B = color%256;
        var G = ((color-B)/256)%256;
        var R = (color-B-G*256)/256/256;
这里用了速度优化,测试时用了1306ms.

更多具体代码稍后讲解...

[ 本帖最后由 FlashK 于 2006-11-29 16:44 编辑 ]
欢迎来我的全Flash站收藏:http://www.flashk3.com/

TOP

我想为了兼容ARGB还是用2字节对齐的好,这样编码也比较方便,虽然冗余比楼上的大,恩大约1.5倍吧。

TOP

to:weni
AS3 的jpg压缩很不错啊~`PNG压缩我感觉应该没什么用处.对人物和风景的压缩比很低,对网页拍屏类的东西倒是压缩很高.

而负担这回事我感觉放在服务端会好一些,毕竟服务器的性能都很好.Flash这边最好就少点运算,少点传输数据了.

其实AS3和Remoting都可以用来作二进制传输.FCS/FMS其实也可以,不过这里只讨论AS2怎么弄和优化性能了,呵~`
欢迎来我的全Flash站收藏:http://www.flashk3.com/

TOP

引用:
原帖由 meud 于 2006-11-25 04:29 发表
还有一个方法啊……
记录第一个像素的颜色值,第二个开始计算与前一个像素的差值,如果颜色相同,那么差值为0,即只要发送一个字节就OK了。
主意不错,偶了一直为传输图像数据大而苦脑,做了个大头照,320*240,传输的数据打印出来有500多K,16进制的,

主要问题:
1.客气端计算慢(这个是主要问题)
2.网络数据传输

我担心要是再算颜色对比,可能客户端会慢得出题.

TOP

没有压缩多少,和前一个像素比对做的

做出的效果:


,0,2081,0,6082,-8104,40g2,2081,-2081,182,20o2,g3,g3,2081,-2,-82,-183,-o2,-40o3,-4105,-6185,-2081,g2,20o4,a185,40g2,-8183,2081,-207v,-82g8,-860h,1o4,s6on,-3snm,a000,-i1gb,-a40c,-o5gj,5rvq,-eb9lh,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7qpjm,1848c,207v,-g188,o187,1g5gh,1m5ok,c1o5,8104,8082,e1o7,2184,-3vo0,a1o6,a002,2081,2103,20g3,60o3,g1,2103,40g2,40g2,20g2,-20g3,-20fu,60o5,-2,7u,-40nu,0,20o0,2081,40g0,1vo2,-3v7v,g1,0,4003,-2,0,-2081,0,60o3,o2,-21o5,-1uvu,-2083,3uvu,-3uvu,-4103,-103,2081,-o2,-2082,-2081,2081,1vvu,0,40g2,-60o1,2081,-2000,0,4002,-2081,-1vo0,2081,0,-1vfv,-o2,0,2081,-g1,-1vo1,4184,2081,-1vo0,-40g2,-20g0,2081,2081,40g2,-40g2,3vfv,2081,-40g2,0,40g2,-40g3,4185,20g2,2083,-6001,fv,1vo0,3vvv,-20o2,-61g5,-2105,-i2ob,40g2,4104,6186,40g2,8104,-a1g4,0,2,-41g7,-i7ol,-m209,g40d,i5gk,e3o8,-3vg1,1tfq,-s68l,-65gf,-e99tf,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7opbl,1a5gi,-40o7,3ufq,m28a,184gd,1q68m,a1g4,a185,-3vfv,i289,40g2,1,8104,20fu,80o6,-3v7v,4083,a1o6,40g2,-1vfv,60o3,2081,-2081,81,-207v,60o3,60o3,-40g4,-6182,60o3,-2081,40g2,0,-4001,40g2,0,0,40g2,-3vg3,2081,-4080,2081,60o3,4003,-40g2,-60o5,-2081,8082,-20g2,-40g2,-2081,-40g2,8082,-20g3,-2081,0,0,2081,-2000,2000,1vo0,-1vo0,-4081,4184,-40g1,0,0,-407v,40g2,-2,0,2000,-2082,5vg1,20o2,40g2,-1vfv,40g2,-80o3

[ 本帖最后由 cnxcs 于 2006-11-30 17:00 编辑 ]

TOP