论坛交流
首页办公自动化| 网页制作| 平面设计| 动画制作| 数据库开发| 程序设计| 全部视频教程
应用视频: Windows | Word2007 | Excel2007 | PowerPoint2007 | Dreamweaver 8 | Fireworks 8 | Flash 8 | Photoshop cs | CorelDraw 12
编程视频: C语言视频教程 | HTML | Div+Css布局 | Javascript | Access数据库 | Asp | Sql Server数据库Asp.net  | Flash AS
当前位置 > 文字教程 > Flash AS教程
Tag:2.0,3.0菜鸟,游戏,,cs,技巧,源码,,文本,文字,函数,音乐,随机,拖拽,asp,access,xml,mc,视频教程

解决Flash as2 中的拍照图片传输量太大的方法

文章类别:Flash AS | 发表日期:2009-8-2 16:57:11

解决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。

 

视频教程列表
文章教程搜索
 
Flash AS推荐教程
Flash AS热门教程
看全部视频教程
购买方式/价格
购买视频教程: 咨询客服
tel:15972130058