解决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。
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |