Flash抠图

Flash抠图

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

相关文章

🪶
妙什么生花的成语
bt365彩票官方app

妙什么生花的成语

08-02 👀 7750
🪶
20大翻墙方法指南:VPN、翻墙工具等全面解析