/**
*
* *---------------------------------------*
* | ***精确选择识别png图片有像素的区域*** |
* *---------------------------------------*
**
* 编辑修改收录:fengzi(疯子、wu341、wgq341)
*
* 不会写代码,我是代码搬运工。
*
* 联系方式:QQ(493712833)。
*
* 随 笔: https://www.cnblogs.com/fengziwu/
*
* 版权协议:请自觉遵守LGPL协议,欢迎修改、复制、转载、传播给更多需要的人。
* 免责声明:任何因使用此软件导致的纠纷与软件/程序开发者无关。
* 日 期: 2019.05.08
*
*/ package fengzi.bmd
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.geom.Matrix;
import flash.geom.Point;
import flash.geom.Rectangle; public class InteractivePNG extends MovieClip
{ // -== Public Properties ==-
public function get interactivePngActive():Boolean
{
return _interactivePngActive;
} public function get alphaTolerance():uint
{
return _threshold;
}
public function set alphaTolerance(value : uint):void
{
_threshold = Math.min(255,value);
} // Excluded from documentation for simplicity, a note is provided under disableInteractivePNG. override public function set hitArea(value : Sprite):void
{
if (value!=null && super.hitArea==null)
{
disableInteractivePNG();
}
else if (value==null && super.hitArea!=null)
{
enableInteractivePNG();
}
super.hitArea = value;
} // Excluded from documentation for simplicity, a note is provided under disableInteractivePNG. override public function set mouseEnabled(enabled : Boolean):void
{
// indicates that mouse has entered clip bounds.
if (isNaN(_buttonModeCache)==false)
{
disableInteractivePNG();
}
super.mouseEnabled = enabled;
} // -== Private Properties ==- protected var _threshold:uint = 128; protected var _transparentMode:Boolean = false; protected var _interactivePngActive:Boolean = false; protected var _bitmapHit:Boolean = false; protected var _basePoint:Point; protected var _mousePoint:Point; protected var _bitmapForHitDetection:Bitmap; protected var _buttonModeCache:Number = NaN; // -== Public Methods ==- public function InteractivePNG():void
{
super();
_basePoint = new Point();
_mousePoint = new Point();
enableInteractivePNG();
} public function drawBitmapHitArea(event:Event=null):void
{
var isRedraw:Boolean = (_bitmapForHitDetection != null);
if (isRedraw)
{
try
{
removeChild(_bitmapForHitDetection);
}
catch (e:Error)
{
}
}
var bounds:Rectangle = getBounds(this);
var left:Number = bounds.left;
var top:Number = bounds.top;
var b:BitmapData = new BitmapData(bounds.width,bounds.height,true,0);
_bitmapForHitDetection = new Bitmap(b); // (So that it is not a mystery if the displaylist is being inspected!)
_bitmapForHitDetection.name = "interactivePngHitMap";
_bitmapForHitDetection.visible = false;
var mx:Matrix = new Matrix();
mx.translate(-left, -top);
b.draw(this, mx);
addChildAt(_bitmapForHitDetection, 0);
_bitmapForHitDetection.x = left;
_bitmapForHitDetection.y = top;
} public function disableInteractivePNG():void
{
deactivateMouseTrap();
removeEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds);
try
{
removeChild(_bitmapForHitDetection);
}
catch (e:Error)
{
}
_bitmapForHitDetection == null;
super.mouseEnabled = true;
_transparentMode = false;
setButtonModeCache(true);
_bitmapHit = false;
_interactivePngActive = false;
} public function enableInteractivePNG():void
{
disableInteractivePNG();
if (hitArea!=null)
{
return;
}
activateMouseTrap();
_interactivePngActive = true;
} // -== Private Methods ==- protected function activateMouseTrap():void
{ //useCapture=true, priority=high, weakRef=true
addEventListener(MouseEvent.ROLL_OVER, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_OVER, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.ROLL_OUT, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_OUT, captureMouseEvent, false, 10000, true);
addEventListener(MouseEvent.MOUSE_MOVE, captureMouseEvent, false, 10000, true);
} protected function deactivateMouseTrap():void
{
removeEventListener(MouseEvent.ROLL_OVER, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_OVER, captureMouseEvent);
removeEventListener(MouseEvent.ROLL_OUT, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_OUT, captureMouseEvent);
removeEventListener(MouseEvent.MOUSE_MOVE, captureMouseEvent);
} protected function captureMouseEvent(event : Event):void
{
if (! _transparentMode)
{
if (event.type == MouseEvent.MOUSE_OVER || event.type == MouseEvent.ROLL_OVER)
{
// The buttonMode state is cached then disabled to avoid a cursor flicker
//buttonMode状态被缓存,然后被禁用以避免光标闪烁。
// at the movieclip bounds. Reenabled when bitmap is hit.
//在移动边界。点击位图时重新启用。
setButtonModeCache();
_transparentMode = true;
super.mouseEnabled = false;
// activates bitmap hit & exit tracking
//激活位图命中和退出跟踪
addEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds, false, 10000, true);
// important: Immediate response, and sets _bitmapHit to correct state for event suppression.
//重要提示:立即响应,并将“位图命中”设置为事件抑制的正确状态。
trackMouseWhileInBounds();
}
} if (! _bitmapHit)
{
event.stopImmediatePropagation();
}
} protected function trackMouseWhileInBounds(event:Event=null):void
{
if (bitmapHitTest() != _bitmapHit)
{
_bitmapHit = ! _bitmapHit; // Mouse is now on a nonclear pixel based on alphaTolerance. Reenable mouse events.
//鼠标现在位于基于alphatolerance的非清晰像素上。重新启用鼠标事件。
if (_bitmapHit)
{
deactivateMouseTrap();
setButtonModeCache(true, true);
_transparentMode = false;
// This will trigger rollOver & mouseOver events
//这将触发滚动和鼠标悬停事件
super.mouseEnabled = true;
}
else if (!_bitmapHit)
{
// Mouse is now on a clear pixel based on alphaTolerance. Disable mouse events but .
//鼠标现在位于基于alphatolerance的清晰像素上。禁用鼠标事件。
_transparentMode = true; // This will trigger rollOut & mouseOut events
//这将触发卷展栏和鼠标输出事件
super.mouseEnabled = false;
}
} // When mouse exits this MovieClip's bounds, end tracking & restore all.
//当鼠标退出movieclip的边界时,结束跟踪并全部恢复。
var localMouse:Point = _bitmapForHitDetection.localToGlobal(_mousePoint);
if (hitTestPoint( localMouse.x, localMouse.y)==false)
{
removeEventListener(Event.ENTER_FRAME, trackMouseWhileInBounds);
_transparentMode = false;
setButtonModeCache(true);
super.mouseEnabled = true;
activateMouseTrap();
}
} protected function bitmapHitTest():Boolean
{
if (_bitmapForHitDetection==null)
{
drawBitmapHitArea();
}
_mousePoint.x = _bitmapForHitDetection.mouseX;
_mousePoint.y = _bitmapForHitDetection.mouseY;
return _bitmapForHitDetection.bitmapData.hitTest(_basePoint, _threshold, _mousePoint);
} protected function setButtonModeCache(restore:Boolean=false, retain:Boolean=false):void
{
if (restore)
{
if (_buttonModeCache==1)
{
buttonMode = true;
}
if (! retain)
{
_buttonModeCache = NaN;
}
return;
}
_buttonModeCache = (buttonMode==true ? 1 : 0);
buttonMode = false;
}
}
}

  

精确选择识别png图片有像素的区域的更多相关文章

  1. 精确选择识别png图片有像素的区域(使用方法)

    /** * * *---------------------------------------* * | ***精确选择识别png图片有像素的区域*** | * *----------------- ...

  2. [ActionScript 3.0] 利用InteractivePNG.as类精确选择识别png图片有像素的区域

    用法:如果是把png直接导入flash转换成影片剪辑,只需在影片剪辑属性中勾选为ActionScript导出(x),并把基类里的flash.display.MovieClip替换成Interactiv ...

  3. Canvas识别相似图片

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 以API方式调用C# dll,使用OneNote2013 sp1实现OCR识别本地图片

    http://www.cnblogs.com/Charltsing/p/OneNoteOCRAPI.html OneNote2013 OCR API调用使用说明2019.4.17 使用说明:1.安装干 ...

  5. 用Delphi直接获取bmp图片的像素

    用Delphi直接获取bmp图片的像素,并存储显示出.(此像素主要用在LED上显示).希望高手能给出代码啊!! function getImagePixels(f: string): Integer; ...

  6. iOS图片的伪裁剪(改变图片的像素值)

    0x00 原理 利用一张图片事先画好的图片(以下称为蒙板),盖在要被裁剪的的图片上,然后遍历蒙板上的像素点,修改被裁剪图片对应位置的像素的色值即可得到一些我们想要的不规则图片了(比如人脸) 0x01 ...

  7. Android实现OCR扫描识别数字图片之图片扫描识别

    [Android实例] Android实现OCR扫描识别数字图片之图片扫描识别 Android可以识别和扫描二维码,但是识别字符串呢? google提供了以下解决方案用的是原来HP的相关资料. 可以吧 ...

  8. win32加载图片获得像素值

    在写光栅渲染器时,需要加载图片获得像素以便进行纹理插值,试了几种方法发现下面这种比价简单,效率也可以接受 Texture2D是我自己定义的类,其中m_pixelBuffer是一个动态二维数组,每个元素 ...

  9. Android 从 Android 本地图库选择多个图片

    原文地址 本文说明如何从 Android 本地图库选择多个图片.作者考虑很多解决方案. 演示从 Android 本地图库选择多个图片,有两个方法可以实现从图库中选择多个图片: 用 Intent 获取多 ...

随机推荐

  1. C# 监测每个方法的执行次数和占用时间(测试5)

    又找到了一个bug 测试的类: public class Class11_1 { public virtual List<int> test2_1(List<tb_SensorRec ...

  2. 【loj2983】【WC2019】数树

    题目 两颗\(n\)个点的树T1和T2,有\(y\)种颜色; 现在给每个点染色,要求公共边端点的颜色相同,求: ​ 1.op=0 , T1和T2都确定,求合法染色方案数: ​ 2.op=1 , T1确 ...

  3. Loj刷题记录

    又是一年云参营. 所以一起刷省选题吧. LOJ2028 「SHOI2016」随机序列 题目链接. 简要社论 发现+和-可以互相抵消,于是有贡献的时候一段前缀的乘积.设\(s[i]=\prod_{j=1 ...

  4. 拉格朗日插值法(c++)【转载】

    摘自<c++和面向对象数值计算>,代码简洁明快,采用模板函数,通用性增强,对其中代码稍加改动 #include<iostream> #include <vector> ...

  5. Linux下WebLogic的启动、停止和后台运行的方法

    Linux下WebLogic的启动.停止和后台运行的方法 进入目录:/home/weblogic/user_projects/domains/base_domain/bin 查看目录下的命令,如图: ...

  6. 团队作业-Alpha(2/4)

    队名:软工9组 组长博客:https://www.cnblogs.com/cmlei/ 作业博客:http://edu.cnblogs.com/campus/fzu/SoftwareEngineeri ...

  7. GD-GAN: Generative Adversarial Networks for Trajectory Prediction and Group Detection in Crowds

    GD-GAN: Generative Adversarial Networks for Trajectory Prediction and Group Detection in Crowds 2019 ...

  8. EMQ 与 mqtt 与 IOT设备

    1.IOT设备的特性 IOT(物联网things of internet)设备和传统的智能设备有什么区别,笔者总结下的IOT设备有如下特点: 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HT ...

  9. android -------- AES加密解密算法

    AES加密标准又称为高级加密标准Rijndael加密法,是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准.AES的基本要求是,采用对称分组密码体制,密钥长度可以为128.192或25 ...

  10. odoo开发笔记 -- 异常处理in resolve_deps field = model

    场景描述: 更新代码,重启服务服务后,odoo后台报错,提示关键字:in resolve_deps field = model._fields[fname]  KeyError: 'entry_id' ...