您的位置:首页 > Web前端 > JavaScript

FLASH 调用摄像头 JS中方法触发拍照,并将照片保存到本地文件夹

2017-05-12 18:02 591 查看
使用 FLASH CS4 开发

有些方法和实现过程是在网上趴的,经过自己的修改,为自己所用。

建一个文件,不用添加任何控件,直接F9 输入如下代码:

import com.adobe.images.JPGEncoder;
import com.adobe.images.PNGEncoder;

var vid:Video;
var cam:Camera = Camera.getCamera();
cam.setMode(400,450,15) // 设置相机在长,宽,侦

// 显示文本信息
var tf:TextField = new TextField();
tf.x = 480; // 文本显示在起始位置
tf.autoSize = TextFieldAutoSize.LEFT;
addChild(tf);

if (cam != null) {
cam.addEventListener(StatusEvent.STATUS, statusHandler);
vid = new Video(400,450);
vid.attachCamera(cam);
// 旋转270度 (因为我的设备上摄像头向左转了90度,所以需要下边在方法)
centerRotate(vid, 270);
}

function statusHandler(event:StatusEvent):void {
if (!cam.muted) {
vid.width = cam.width;
vid.height = cam.height;
addChild(vid);
}
cam.removeEventListener(StatusEvent.STATUS, statusHandler);
}

/* 一个测试方法,可以用JS调用的 */
ExternalInterface.addCallback("testAS",testFunc);
function testFunc(txt:String):String{
tf.appendText("2222:::"+txt+"\n");
ExternalInterface.call("saveBrushCardInfo","");
return "SUCCESS";
}

// 获得照片信息(该方法被JS调用)
ExternalInterface.addCallback("getImageAS",getImage);
function getImage(url:String):void{
// 拍照获得照片byte数组
var bitmapData:BitmapData = new BitmapData(vid.height, vid.width-55, false, 0xFFCC00);
bitmapData.draw(vid);
var bytes:ByteArray = PNGEncoder.encode(bitmapData);

// 将照片byte发送请求到后台处理
var req:URLRequest = new URLRequest(url);
req.data = bytes;
req.method = URLRequestMethod.POST;
req.contentType = "application/octet-stream";

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(req);
//tf.appendText("3333333333333:::"+"\n");
loader.addEventListener(Event.COMPLETE, completeHandler);

}

// 回调函数, 调用JS方法 saveBrushCardInfo
function completeHandler(evt:Event):void {
// ExternalInterface.call("asCallJS","I,m AS!");
ExternalInterface.call("saveBrushCardInfo","");
// trace(evt.target.data);
}

/**
* 绕中心点旋转
* @param mc 元件
* @param angle 角度 360 280
*/
function centerRotate(mc:DisplayObject,angle:Number):void{
//获取mc不旋转时候的尺寸
var currentRotation:Number = mc.rotation;
//tf.appendText("currentRotation:::"+currentRotation+"\n");
mc.rotation = 0;
var mcWidth:Number = mc.width;
var mcHeight:Number = mc.height;
//mc.rotation = currentRotation;

//获取mc当前中心点坐标
var pointO:Point = mc.localToGlobal(new Point(mcWidth / 2, mcHeight / 2));
//tf.appendText("pointO:::"+pointO.x +" --- "+pointO.y +"\n");
//旋转mc
mc.rotation = angle;

//获取mc旋转后中心点坐标
var pointO2:Point = mc.localToGlobal(new Point( mcWidth/ 2, mcHeight / 2));
//tf.appendText("pointO2:::"+pointO2.x +" --- "+pointO2.y +"\n");

//平移到原来中心点O
var p3:Point = pointO.subtract(pointO2); // 减去
//tf.appendText("p3:::"+p3.x +" --- "+p3.y +"\n");
var matrix:Matrix = mc.transform.matrix;
matrix.translate(p3.x, 400);

mc.transform.matrix = matrix;

}

// 向左旋转90
function scaleLeft(bmp:BitmapData):BitmapData{
var m:Matrix = new Matrix();
m.rotate(-Math.PI/2);
m.translate(0,bmp.width);
var bd:BitmapData = new BitmapData(bmp.height, bmp.width,false);
bd.draw(bmp,m);
return bd;
}

保存flash 为webCamera.fla

点击F12 运行 ,导出html文件,生成webCamera.fla, webCamera.html,webCamera.swf及com包。

此时运行webCamera.html是可以调用设备上的摄像头。

处理完FLASH, 就该处理考虑JS调用拍照,并用java保存了。

将webCamera.html中javascript 的内容做成js, 取名为AC_RunActiveContent.js,方便放在jsp中使用。

在webCamera.html改成webCamera.jsp.jsp中调用AC_RunActiveContent.js,webCamera.html中<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,0,0"
width="660" height="580" id="webCamera" align="middle">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="../../pages/pad/liShiJi/flash/webCamera.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="../../pages/pad/liShiJi/flash/webCamera.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="webCamera" align="middle"
allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_cn" />
</object>代码就是实现调用摄像头的功能。
在jsp中增加JS方法

var URL = "http://IP:端口/项目/lishiji/getImgAndSave"; //java 保存图片的方法
function getImageAS(){
var swf = window["webCamera"] || document["webCamera"]; // 获得FLASH控件
swf["getImageAS"](URL); // 这个方法得注意了,是调用flash控件中的 getImageAS方法,并传参数URL. getImageAS方法在控件的代码中有,可以去查看。
}其中getImageAS方法如下(此代码已经在flash中了):
// 获得照片信息(该方法被JS调用)
ExternalInterface.addCallback("getImageAS",getImage); // 设置JS中调用的getImageAS方法对应的着这里的getImage方法
function getImage(url:String):void{
// 拍照获得照片byte数组
var bitmapData:BitmapData = new BitmapData(vid.height, vid.width-55, false, 0xFFCC00);
bitmapData.draw(vid);
var bytes:ByteArray = PNGEncoder.encode(bitmapData);

// 将照片byte发送请求到后台处理
var req:URLRequest = new URLRequest(url);
req.data = bytes;
req.method = URLRequestMethod.POST;
req.contentType = "application/octet-stream";

var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.load(req);
// 当处理完图片后,再调用JS的方法,将照片在页面中展示出来(此方法可以根据需要,要或者不要的)
loader.addEventListener(Event.COMPLETE, completeHandler);

}
// 回调函数, 调用JS方法 saveBrushCardInfo
function completeHandler(evt:Event):void {
ExternalInterface.call("saveBrushCardInfo","");
}



java接收图片的方法是

if ("application/octet-stream".equals(request.getContentType())) {
try {
int i = request.getContentLength();
byte buffer[] = new byte[i];
int j = 0;
while (j < i) { // 获取表单的上传文件
int k = request.getInputStream().read(buffer, j, i - j);
j += k;
}

if (buffer.length >= 0) { // 文件是否为空
File file = new File("D\\:/flash/newImg.png");
OutputStream out = new BufferedOutputStream(
new FileOutputStream(file, true));
out.write(buffer);
out.close();
}
} catch (Exception e) {
e.printStackTrace();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  flash