咖喱碗糕`

`∧ ∧︵
ミ^ō^ミ灬)~ ~我是只可爱的狐狸```
http://freedom2130.cnblogs.com
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
现在我把FLASH部分通过摄象头获得图象信息的代码贴出来。供大家参考。

这段代码是我参考了别人的代码自己写出来的。原来的那个网站里总共提供了两个类来实现这个问题。估计贴出来大多数人也会看的眼花缭乱不知所以(其实我也没太看明白)。所以按原来程序的思路自己重新写了一部分。详细说明逐步贴上。如果大家有什么不明白的,欢迎跟贴讨论

注意:本程序需要Video的支持。具体添加办法请搜索FLASH8帮助(这个东西是FLASH库本身自带的)

/*FLASH大头贴原程序

/*程序编写:Benmouse 2005-12-01

import flash.display.BitmapData; //要应用这个对象。。必须要包含一下


myCrame=Camera.get();      //创建摄象头对象
myVideo.attachVideo(myCrame);   //显示视频

var imger:BitmapData = new BitmapData(myVideo._width, myVideo._height, false);
imgShow.attachBitmap(imger, this.getNextHighestDepth(), "auto", true);
var thehang:Number=0;
var ID:Number;
var PX:Array=new Array();
btn1.onRelease=function()
{
 imger.draw(myVideo); //imger是场景中一个空的组件,用来显示myVideo的图象
 thehang=0;
 _root.ID=setInterval(makeImg, 5);
}

function makeImg()
{
 var pix:Number;
 var pixer:String;
 PX[thehang]=new Array();
 for(w=0;w<imgShow._width;w++)
 {
  pix=imger.getPixel(w,thehang);
  pixer=pix.toString(16);
  if(pix == 0xFFFFFF) pixer = ""; // don't send blank pixel
  PX[thehang].push(pixer);
 }
 thehang+=1;
 if(thehang>=imgShow._height)
 {
  clearInterval(_root.ID);
  imger.dispose();
  sendVars();
 }
}

function sendVars()
{
 sender=new LoadVars();
 sender.w=myVideo._width;
 sender.h=myVideo._height;
 
 for(i=0;i<sender.h;i++)
 {
     sender["PX"+i]=_root.PX[i];
 }
 sender.send("send.php","_blank","POST");
}

【具体说明一】

_root.ID=setInterval(makeImg, 5) 与 function makeImg() 函数

setInterval的作用是控制某函数在规定的时间内重复运行.比如在本程序中的"_root.ID=setInterval(makeImg, 5)".即是每过5毫秒调用makeImg()这个函数一次.注意在setInterval中,makeImg不需要再加().只写名字就可以了.关于setInterval的具体用法,请参照FLASH8的帮助文当,写的相当清楚.

makeImg函数是将图片信息转换为数据信息的主要实现函数。在这里我们使用了数组运算符[]来对变量的数值进行控制。因为在数据的发送过程中,不管是通过POST方法还是GET方法,每个变量发送的数据长度是有限制的。我在自己的机器上测试,把所有的数据信息放在一个PX变量里。那发到PHP的时候,只能还原4行左右的图片资料。所以必须把数据分开来存放。在本程序中,我们是以行为单位来保存数据的,即图片每1象素高的数据保存在一个变量中。首先我们定义了一个变量thehang,初始值为0。用来控制行数。将PX定义成一个二维数组。由于每5毫秒运行一次makeimg函数。那么就可以每5毫秒读取一行数据,然后将thehang加一。这样在下一个5毫秒的时候就会读取下一行数据,我们通过imger.getPixel(w,thehang)来得到第thehang行,第w列的象素值,并把这个数据推入PX[thehang]里保存。随着行数增加,总会有thehang的值和图象的高度相等的时候,那么这个时候所有的数据都应该读完了,我们可以停下setInterval,不让他继续调用。这里使用了clearInterval(_root.ID);注意_root.ID是我们在开始的时候获得过了的。

【具体说明二】

关于makeImg的运行.其实这段代码中最主要的程序段就是makeimg函数了.再把这个部分的代码贴一次.

function makeImg()
{
 var pix:Number;  //定义一个变量pix 用来读取象素的数值(16进制)
 var pixer:String; //定义一个变量pixer用来保存象素的数值(字符型)
 PX[thehang]=new Array(); //PX[thehang]用来保存第thehang行的所有象素信息
 for(w=0;w<imgShow._width;w++) // 循环
 {
  pix=imger.getPixel(w,thehang); //获得第thehang行,w列的数据
  pixer=pix.toString(16); //转换成字符类型
  if(pix == 0xFFFFFF) pixer = ""; // 防止空白
  PX[thehang].push(pixer); //将象素信息推入PX数组
 }
 thehang+=1; //下一行数据
 if(thehang>=imgShow._height)
 {

 //如果thehang等于图片的高度,那么说明信息已经全部读完,可以停止执行本函数了
  clearInterval(_root.ID);
  imger.dispose();
  sendVars();
 }
}

 

根据注释,可以看到,这个函数实际上是通过循环逐个象素读取.全部读取完成后将变量发送出去.