资源描述
flex 截取摄像头保存本地图片
分类: flex32010-10-07 16:54 880人阅读 评论(3) 收藏 举报
Main.xml
[xhtml] view plaincopy
1. <?xml version="1.0" encoding="utf-8"?>
2. <mx:Application xmlns:mx=" layout="absolute" fontSize="12" creationComplete="init()">
3.
4.
5. <mx:Script>
6. <!--[CDATA[
7. import mx.containers.Canvas;
8. import mx.controls.Alert;
9. import mx.core.FlexBitmap;
10. import mx.core.FlexShape;
11. import mx.core.UIComponent;
12. import mx.events.DragEvent;
13. import mx.graphics.codec.PNGEncoder;
14. import mx.rpc.events.ResultEvent;
15.
16.
17. private var c:Canvas;
18. private var pt:Point;
19. //private var shape:FlexBitmap;
20. private var pbitData:BitmapData;
21.
22. //创建摄像头
23. private function camInit():void
24. {
25. var cam:Camera=Camera.getCamera();
26. if (cam == null)
27. {
28. Alert.show("你没有摄像头!");
29. }
30. /* else if(cam.currentFPS==0){
31. Alert.show("摄像头被占用!");
32. } */
33. else
34. {
35. cam.setMode(400,300,30); //设置宽、高
36. video.attachCamera(cam);
37. }
38.
39. }
40.
41. //查看图片
42. private function viewPhoto():void
43. {
44. var bData:BitmapData=new BitmapData(video.width,video.height);
45. bData.draw(video);
46. var bp:Bitmap=new Bitmap(bData);
47. this.img.source=bp;
48. }
49. //保存图片到本地
50. private function savePhoto(evt:MouseEvent):void
51. {
52. var png:PNGEncoder=new PNGEncoder();
53. var imgArr:ByteArray=png.encode(pbitData);
54. //保存到本地
55. var file:FileReference=new FileReference();
56. file.save(imgArr,"myphoto.png");
57.
58. //上传到服务器
59. /*var req:URLRequest=new URLRequest("");
60. req.method="post";
61. var param:URLVariables=new URLVariables();
62. req.contentType="application/octet-stream";
63. req.data=imgArr;
64. var loder:URLLoader=new URLLoader();
65. loder.load(req);
66.
67. loder.addEventListener(Event.COMPLETE,resultHandle);*/
68.
69. }
70.
71. //后台上传完成,提示
72. private function resultHandle(e:ResultEvent):void{
73. Alert.show("上传完成");
74. }
75. /*===============================================*/
76.
77. private var template:UIComponent;
78. private var downPoint:Point;
79. //初始化
80. private function init():void{
81. downPoint = new Point();
82. template = new UIComponent();
83. //截取后双击保存
84. template.doubleClickEnabled=true;
85. template.addEventListener(MouseEvent.DOUBLE_CLICK,savePhoto);
86.
87. template.x = img.x;
88. template.y = img.y;
89. addChild( template );
90.
91. //显示截取的图片
92. /* cutOutShape = new FlexBitmap();
93. var uic:UIComponent = new UIComponent();
94. uic.addChild( cutOutShape );
95. addChild( uic );
96. uic.x = 450;
97. uic.y = 69; */
98.
99. }
100.
101. //鼠标按下,绘制椭圆矩形框
102. private function mousedown(e:MouseEvent):void{
103. downPoint.x = img.mouseX;
104. downPoint.y = img.mouseY;
105.
106. template.graphics.clear();
107. img.addEventListener( MouseEvent.MOUSE_MOVE, overhandle );//添加鼠标移动事件
108.
109. }
110. private function overhandle(evt:MouseEvent):void{
111. template.graphics.clear();//清空
112. template.graphics.lineStyle( 1, 0x0000FF );//设置线样式
113. template.graphics.beginFill( 0xFFFFFF, 0.2 );
114. //画圆角矩形
115. template.graphics.drawRoundRect( downPoint.x, downPoint.y, img.mouseX - downPoint.x - 2, img.mouseY - downPoint.y - 2, 20, 20 );
116. }
117. //鼠标松开,停止绘画
118. private function mouseup(e:MouseEvent):void{
119. img.removeEventListener( MouseEvent.MOUSE_MOVE, overhandle );
120.
121. template.graphics.endFill();
122.
123. if( template.transform.pixelBounds.width != 0 )
124. {
125. //保存裁剪图片为BitmapData
126. pbitData= DisplayObjectTransformer.cutOutSuper( img, template );
127. }
128. }
129.
130.
131. ]]-->
132. </mx:Script>
133. <mx:VideoDisplay id="video" x="23" y="10" width="430" height="320"/>
134. <mx:Button x="461" y="40" label="Camera" click="camInit()"/>
135. <mx:Image id="img" x="512" y="106" width="221" height="183" toolTip="双击保存图片到本地"
136. source="1.png" mouseDown="mousedown(event)"
137. mouseUp="mouseup(event)"/>
138. <mx:Button x="546" y="40" label="viewPhoto" click="viewPhoto()"/>
139. <mx:Button x="664" y="40" label="savePhoto" click="savePhoto(event)"/>
140. </mx:Application>
DisplayObjectTransformer.as(使用了高手写的截取转化BitmapData类)
[java] view plaincopy
1. package
2. {
3. import flash.display.BitmapData;
4. import flash.display.DisplayObject;
5. import flash.geom.Matrix;
6. import flash.geom.Rectangle;
7.
8. /**
9. * DisplayObjectTransformer 类有两个静态函数:一个用来裁剪矩形;一个用来裁剪任意形状。
10. */
11. public class DisplayObjectTransformer
12. {
13.
14. /**
15. * 构造函数
16. * <p>本类所有方法均为静态方法,不应创建实例。</p>
17. */
18. public function DisplayObjectTransformer()
19. {
20.
21. }
22.
23.
24.
25. //------------------------------------------------------------
26. //
27. // 裁剪
28. //
29. //------------------------------------------------------------
30. /**
31. * 裁剪指定矩形区域并返回一个包含结果的 BitmapData 对象。
32. *
33. * @param target 需要裁剪的显示对象。
34. *
35. * @param width 位图图像的宽度,以像素为单位。
36. *
37. * @param height 位图图像的高度,以像素为单位。
38. *
39. * @param distanceX 切割矩形左上角的点到显示对象矩形左上角的点的水平距离。注意:左上角的点不一定就是注册点(0, 0)外,变形过的显示对象就是一个例外。
40. *
41. * @param distanceY 切割矩形左上角的点到显示对象矩形左上角的点的垂直距离。注意:左上角的点不一定就是注册点(0, 0)外,变形过的显示对象就是一个例外。
42. *
43. * @param transparent 指定裁剪后的位图图像是否支持每个像素具有不同的透明度。默认值为 true(透明)。若要创建完全透明的位图,请将 transparent 参数的值设置为 true,将 fillColor 参数的值设置为 0x00000000(或设置为 0)。将 transparent 属性设置为 false 可以略微提升呈现性能。
44. *
45. * @param fillColor 用于填充裁剪后的位图图像区域背景的 32 位 ARGB 颜色值。默认值为 0x00000000(纯透明黑色)。
46. *
47. * @returns 返回裁剪后的 BitmapData 对象。
48. */
49. public static function cutOutRect( target:DisplayObject, distanceX:Number, distanceY:Number, width:Number, height:Number, transparent:Boolean = true, fillColor:uint = 0x00000000 ):BitmapData
50. {
51. var m:Matrix = target.transform.matrix;
52. m.tx -= target.getBounds( target.parent ).x + distanceX;
53. m.ty -= target.getBounds( target.parent ).y + distanceY;
54.
55. var bmpData:BitmapData = new BitmapData( width, height, transparent, fillColor );
56. bmpData.draw( target, m );
57.
58. return bmpData;
59. }
60.
61.
62.
63. /**
64. * 超级裁剪工具!可裁剪任意形状!给定一个裁剪目标和一个模板,就可根据模板裁剪出形状相配的 BitmapData 数据。
65. *
66. * @param target 需要裁剪的显示对象。
67. *
68. * @param template 裁剪模板,可以是任意形状。
69. *
70. * @returns 返回裁剪后的 BitmapData 对象。
71. */
72. public static function cutOutSuper( target:DisplayObject, template:DisplayObject ):BitmapData
73. {
74. var rectTarget:Rectangle = target.transform.pixelBounds;
75. var rectTemplate:Rectangle = template.transform.pixelBounds;
76. var targetBitmapData:BitmapData = DisplayObjectTransformer.cutOutRect( target, 0, 0, rectTarget.width, rectTarget.height, true, 0x00000000 );
77. var templateBitmapData:BitmapData = DisplayObjectTransformer.cutOutRect( template, 0, 0, rectTemplate.width, rectTemplate.height, true, 0x00000000 );
78.
79. for( var pixelY:int = 0; pixelY < rectTemplate.height; pixelY++ )
80. {
81. for( var pixelX:int = 0; pixelX < rectTemplate.width; pixelX++ )
82. {
83. if( templateBitmapData.getPixel( pixelX, pixelY ) != 0 )
84. {
85. var color:uint = targetBitmapData.getPixel32( pixelX + rectTemplate.x - rectTarget.x, pixelY + rectTemplate.y - rectTarget.y );
86. templateBitmapData.setPixel32( pixelX, pixelY, color );
87. }
88. }
89. }
90.
91. return templateBitmapData;
92.
93. }
94.
95.
96.
97. }
98. }
分享到:
· 上一篇:SQL2005服务无法启动
展开阅读全文