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导出效果:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西溪漫步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值