这篇文章跟上一篇截图差不多,只是实现方法不一样,上一篇是通过设置像素实现,而这一篇是通过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导出效果: