这篇文章跟上一篇截图差不多,只是实现方法不一样,上一篇是通过设置像素实现,而这一篇是通过draw方法来实现
1、新建一fla文件SnapshotImage.fla,导入一张美图,并选择在第一帧导出BitmapData类
2、新建SnapshotImage.as文件,并与SnapshotImage.fla关联
SnapshotImage.as:
package { import flash.display.*; import flash.events.*; import flash.net.URLRequest; import flash.geom.*; import flash.filters.*; public class SnapshotImage extends Sprite { private var _imageBitmapData:BitmapData; private var _imageHotAreaData:BitmapData; private var _imageBitmap:Bitmap; private var _mouseRectContainer:Sprite; private var _mouseRectStartX:Number; private var _mouseRectStartY:Number; private var _imageClipDraging:Boolean; private var _currentDragClip:Sprite; public function SnapshotImage() { _imageBitmapData = new BeautifulGril(); _imageBitmap = new Bitmap(_imageBitmapData); addChild(_imageBitmap); _mouseRectContainer = new Sprite(); addChild(_mouseRectContainer); configMouseEvent(); var c:ColorTransform = new ColorTransform ; c.color = 0xff0000; _imageHotAreaData = _imageBitmapData.clone(); _imageHotAreaData.draw(_imageHotAreaData,null,c); } private function configMouseEvent():void { stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler,false,0,true); stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler,false,0,true); } private function mouseDownHandler(e:MouseEvent):void { if (_imageClipDraging) { return; } _mouseRectStartX = e.stageX; _mouseRectStartY = e.stageY; stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); } private function mouseUpHandler(evt:MouseEvent):void { if(_imageClipDraging) { _currentDragClip.stopDrag(); _imageClipDraging=false; _currentDragClip.alpha=1; } else { cutImage(checkIntersection()); _mouseRectContainer.graphics.clear(); stage.removeEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler); } } private function mouseMoveHandler(e:MouseEvent):void { e.updateAfterEvent(); var minX:Number = Math.min(e.stageX,_mouseRectStartX); var minY:Number = Math.min(e.stageY,_mouseRectStartY); var maxX:Number = Math.max(e.stageX,_mouseRectStartX); var maxY:Number = Math.max(e.stageY,_mouseRectStartY); _mouseRectContainer.graphics.clear(); _mouseRectContainer.graphics.lineStyle(0); _mouseRectContainer.graphics.beginFill(0xffff00,0.5); _mouseRectContainer.graphics.drawRect(0,0,maxX-minX,maxY-minY); _mouseRectContainer.x = minX; _mouseRectContainer.y = minY; } /**拖动剪切的矩形区域**/ private function clipMouseDownHandler(e:MouseEvent):void { var target:Sprite = e.target as Sprite; _currentDragClip = target; _currentDragClip.alpha = .5; _imageClipDraging = true; _currentDragClip.startDrag(false); } /**检查相交的矩形区域**/ private function checkIntersection():Rectangle { var intersectRect:Rectangle = _imageBitmapData.rect.intersection(new Rectangle(_mouseRectContainer.x - _imageBitmap.x,_mouseRectContainer.y - _imageBitmap.y,_mouseRectContainer.width,_mouseRectContainer.height)); trace("与源图BitmapData相交范围:"+intersectRect); if (intersectRect.width == 0 || intersectRect.height == 0) { return null; } var bitmapData:BitmapData = new BitmapData(intersectRect.width,intersectRect.height,true,0); bitmapData.draw(_imageHotAreaData,new Matrix(1,0,0,1,-intersectRect.x,-intersectRect.y),null,null,new Rectangle(0,0,intersectRect.width,intersectRect.height)); var intersectHotAreaRect:Rectangle = bitmapData.getColorBoundsRect(0xFFFF0000,0xFFFF0000,true); trace("最终切图块的范围:"+intersectHotAreaRect); if (intersectHotAreaRect.width == 0 || intersectHotAreaRect.height == 0) { return null; } //扩展范围避免误差 intersectHotAreaRect.x -= 1; intersectHotAreaRect.y -= 1; intersectHotAreaRect.width += 2; intersectHotAreaRect.height += 2; return intersectHotAreaRect; } private function cutImage(rect:Rectangle):void {//关键的切图部分 if (! rect) { return; } var clipBitmapData:BitmapData = new BitmapData(rect.width,rect.height,true,0); trace(_mouseRectContainer.x,_imageBitmap.x,rect.x); var cliptX:Number=(_mouseRectContainer.x=_mouseRectContainer.x<_imageBitmap.x?0:_mouseRectContainer.x-_imageBitmap.x)+rect.x; var cliptY:Number=(_mouseRectContainer.y=_mouseRectContainer.y<_imageBitmap.y?0:_mouseRectContainer.y-_imageBitmap.y)+rect.y; clipBitmapData.draw(_imageBitmapData,new Matrix(1,0,0,1,-cliptX,-cliptY),null,null,new Rectangle(0,0,rect.width,rect.height)); var clipBitmap:Bitmap = new Bitmap(clipBitmapData); clipBitmap.filters = [new GlowFilter(0,1,2,2,10,1)]; var rectSpr:Sprite = new Sprite(); rectSpr.graphics.lineStyle(0); rectSpr.graphics.lineTo(rect.width,0); rectSpr.graphics.lineTo(rect.width,rect.height); rectSpr.graphics.lineTo(0,rect.height); rectSpr.graphics.lineTo(0,0); rectSpr.x = _mouseRectContainer.x + rect.x + _imageBitmap.x; rectSpr.y = _mouseRectContainer.y + rect.y + _imageBitmap.y; rectSpr.addEventListener(MouseEvent.MOUSE_DOWN,clipMouseDownHandler); this.addChild(rectSpr); rectSpr.addChild(clipBitmap); var fillRect:Rectangle = new Rectangle(rectSpr.x - _imageBitmap.x,rectSpr.y - _imageBitmap.y,rect.width,rect.height); _imageBitmapData.fillRect(fillRect,0); _imageHotAreaData.fillRect(fillRect,0); } } }
Ctrl+Enter导出效果: