再来改进一下我们的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 编辑 ]